SSL 证书管理 #
SSL 概述 #
什么是 SSL? #
SSL(Secure Sockets Layer)证书用于加密网站与用户之间的通信:
text
┌──────────────────────────────────────────────────────┐
│ │
│ 用户浏览器 │
│ │ │
│ │ HTTPS 加密通信 │
│ ▼ │
│ ┌─────────┐ │
│ │ SSL 证书 │ ← 验证身份 + 加密数据 │
│ └────┬────┘ │
│ │ │
│ ▼ │
│ Vercel 服务器 │
│ │
└──────────────────────────────────────────────────────┘
HTTPS 的好处 #
| 好处 | 说明 |
|---|---|
| 数据加密 | 保护敏感信息不被窃取 |
| 身份验证 | 确保用户访问的是真实网站 |
| SEO 优化 | 搜索引擎优先 HTTPS 网站 |
| 浏览器信任 | 避免安全警告 |
| 现代功能 | PWA、Service Worker 等需要 HTTPS |
Vercel SSL 特性 #
自动 SSL #
text
┌─────────────────────────────────────────┐
│ Vercel SSL 特性 │
├─────────────────────────────────────────┤
│ 自动配置 → 添加域名后自动配置 │
│ 免费证书 → Let's Encrypt 证书 │
│ 自动续期 → 无需手动续期 │
│ 通配符支持 → 支持 *.example.com │
└─────────────────────────────────────────┘
证书提供商 #
Vercel 使用 Let’s Encrypt 提供免费 SSL 证书:
text
Let's Encrypt 特点:
├── 免费
├── 自动化
├── 开放透明
└── 90 天有效期(自动续期)
SSL 配置流程 #
自动配置 #
text
添加域名 → DNS 验证 → 自动申请证书 → 配置完成
text
┌──────────────────────────────────────────────────────┐
│ │
│ 1. 添加自定义域名 │
│ │ │
│ ▼ │
│ 2. 配置 DNS 记录 │
│ │ │
│ ▼ │
│ 3. Vercel 自动检测域名 │
│ │ │
│ ▼ │
│ 4. 自动申请 SSL 证书 │
│ │ │
│ ▼ │
│ 5. HTTPS 生效 │
│ │
└──────────────────────────────────────────────────────┘
查看证书状态 #
text
Project Settings → Domains → SSL
text
┌─────────────────────────────────────────┐
│ SSL Certificate │
├─────────────────────────────────────────┤
│ Status: Valid ✓ │
│ Issuer: Let's Encrypt │
│ Valid From: 2024-01-01 │
│ Valid To: 2024-04-01 │
│ Auto-renewal: Enabled │
└─────────────────────────────────────────┘
证书状态说明 #
| 状态 | 说明 | 操作 |
|---|---|---|
| Valid | 证书有效 | 无需操作 |
| Pending | 正在申请 | 等待完成 |
| Failed | 申请失败 | 检查 DNS 配置 |
| Expired | 已过期 | 自动续期中 |
强制 HTTPS #
启用强制 HTTPS #
text
Project Settings → Domains → HTTPS
text
┌─────────────────────────────────────────┐
│ Force HTTPS │
├─────────────────────────────────────────┤
│ ☑ Redirect all HTTP traffic to HTTPS │
│ │
│ [Save] │
└─────────────────────────────────────────┘
通过配置文件 #
json
{
"headers": [
{
"source": "/(.*)",
"headers": [
{
"key": "Strict-Transport-Security",
"value": "max-age=31536000; includeSubDomains"
}
]
}
]
}
HSTS 配置 #
text
Strict-Transport-Security 响应头:
├── max-age=31536000 → 有效期 1 年
├── includeSubDomains → 包含子域名
└── preload → 加入浏览器预加载列表
自定义证书 #
上传自定义证书 #
Vercel 支持上传自定义 SSL 证书:
text
Project Settings → Domains → SSL → Upload Certificate
text
┌─────────────────────────────────────────┐
│ Upload Custom Certificate │
├─────────────────────────────────────────┤
│ Certificate (PEM format) │
│ ┌─────────────────────────────────┐ │
│ │ -----BEGIN CERTIFICATE----- │ │
│ │ ... │ │
│ │ -----END CERTIFICATE----- │ │
│ └─────────────────────────────────┘ │
│ │
│ Private Key (PEM format) │
│ ┌─────────────────────────────────┐ │
│ │ -----BEGIN PRIVATE KEY----- │ │
│ │ ... │ │
│ │ -----END PRIVATE KEY----- │ │
│ └─────────────────────────────────┘ │
│ │
│ [Upload] │
└─────────────────────────────────────────┘
使用场景 #
text
┌─────────────────────────────────────────┐
│ 自定义证书使用场景 │
├─────────────────────────────────────────┤
│ 企业证书 → 组织内部信任 │
│ EV 证书 → 绿色地址栏 │
│ 通配符证书 → 多子域名 │
│ 多域名证书 → 多个域名 │
└─────────────────────────────────────────┘
通配符证书 #
自动配置 #
Vercel 自动为通配符域名配置 SSL:
bash
vercel domains add '*.example.com'
DNS 验证 #
text
类型: TXT
名称: _acme-challenge
值: [Vercel 提供的验证值]
使用场景 #
text
*.example.com SSL 覆盖:
├── app.example.com
├── api.example.com
├── blog.example.com
└── 任意子域名
证书续期 #
自动续期 #
text
┌─────────────────────────────────────────┐
│ 证书续期流程 │
├─────────────────────────────────────────┤
│ 证书到期前 30 天 │
│ │ │
│ ▼ │
│ Vercel 自动续期 │
│ │ │
│ ▼ │
│ 验证域名所有权 │
│ │ │
│ ▼ │
│ 签发新证书 │
│ │ │
│ ▼ │
│ 自动部署新证书 │
└─────────────────────────────────────────┘
手动续期 #
如果自动续期失败,可以手动触发:
bash
vercel domains renew example.com
续期失败处理 #
text
检查项:
├── DNS 记录是否正确
├── 域名是否已过期
├── 是否有 DNS 验证记录
└── 联系 Vercel 支持
SSL 验证 #
在线验证工具 #
命令行验证 #
bash
openssl s_client -connect example.com:443 -servername example.com
bash
curl -vI https://example.com
查看证书详情 #
bash
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -dates
text
notBefore=Jan 1 00:00:00 2024 GMT
notAfter=Apr 1 00:00:00 2024 GMT
常见问题 #
证书申请失败 #
text
常见原因:
├── DNS 记录未正确配置
├── DNS 传播未完成
├── 域名被防火墙阻止
├── 已有其他证书冲突
└── Let's Encrypt 速率限制
混合内容警告 #
text
问题:HTTPS 页面加载 HTTP 资源
解决方案:
├── 确保所有资源使用 HTTPS
├── 使用相对协议 //example.com/resource.js
├── 配置 CSP 升级不安全请求
CSP 配置:
json
{
"headers": [
{
"source": "/(.*)",
"headers": [
{
"key": "Content-Security-Policy",
"value": "upgrade-insecure-requests"
}
]
}
]
}
证书链不完整 #
text
问题:某些设备不信任证书
解决方案:
├── 确保证书链完整
├── 包含中间证书
└── 使用 SSL Labs 测试
Cloudflare SSL 配置 #
如果使用 Cloudflare:
text
Cloudflare SSL 模式:
├── Off → 不推荐
├── Flexible → 不推荐
├── Full → 可用
└── Full (Strict) → 推荐
SSL 最佳实践 #
安全配置清单 #
text
┌─────────────────────────────────────────┐
│ SSL 安全配置清单 │
├─────────────────────────────────────────┤
│ ✓ 启用强制 HTTPS │
│ ✓ 配置 HSTS │
│ ✓ 使用 TLS 1.2+ │
│ ✓ 禁用弱加密算法 │
│ ✓ 启用 OCSP Stapling │
│ ✓ 配置 CSP 策略 │
└─────────────────────────────────────────┘
安全响应头配置 #
json
{
"headers": [
{
"source": "/(.*)",
"headers": [
{
"key": "Strict-Transport-Security",
"value": "max-age=31536000; includeSubDomains; preload"
},
{
"key": "X-Content-Type-Options",
"value": "nosniff"
},
{
"key": "X-Frame-Options",
"value": "DENY"
},
{
"key": "X-XSS-Protection",
"value": "1; mode=block"
}
]
}
]
}
下一步 #
SSL 配置完成后,接下来学习 预览部署 了解 Vercel 的预览功能!
最后更新:2026-03-28