KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA
05 · 证书申请:拿到那两个文件 — keel 龙骨
本章目标:拿到 Nginx 可用的 crt(证书链)与 key(私钥)两个文件。 验收标准:能说出自己证书的签发者、有效期、覆盖域名,并已把两个文件传到服务器。
本章目标:拿到 Nginx 可用的
crt(证书链)与key(私钥)两个文件。
验收标准:能说出自己证书的签发者、有效期、覆盖域名,并已把两个文件传到服务器。
一、三种证书,你只需要 DV
| 类型 | 验证内容 | 签发速度 | 适用场景 |
|---|---|---|---|
| DV(域名验证) | 只验证域名控制权 | 分钟级 | 个人站点、博客、作品集 —— 用这个 |
| OV(组织验证) | 验证企业实体 | 3~7 天 | 企业官网,地址栏显示公司名 |
| EV(扩展验证) | 最严格 | 1~2 周 | 金融/电商(现代浏览器已弱化 EV 的视觉差异) |
对个人站点,DV 就够了。浏览器地址栏那把锁只取决于"证书有效且域名匹配",与 OV/EV 无关。
二、两条获取路径的选择
路径 A:云厂商免费证书(推荐给第一次做的人)
国内主流云厂商都提供免费 DV 证书(通常单域名、有效期 90 天或 1 年,到期需重新申请)。
流程:
- 控制台 → SSL 证书 / 证书管理 → 申请免费证书
- 填域名:
www.xxxxxx.cn(先只签 www,后面再决定要不要加裸域名) - 选择验证方式:
- 自动 DNS 验证(域名在同一家云厂商时最省事):系统自动加 TXT 记录
- 手动 DNS 验证:按提示给你的域名加一条
_acme-challenge或指定的 TXT 记录,等生效后点验证 - 文件验证(HTTP-01):下载一个验证文件放到服务器指定路径
- 签发完成后选择「Nginx」格式下载,得到一个压缩包,里面有:
xxxxxx.cn_bundle.crt # 证书链(含中间证书)—— nginx 的 ssl_certificate 用这个 xxxxxx.cn.key # 私钥 —— ssl_certificate_key 用这个
⚠️ 必须用 bundle(链完整)的那个 crt。只传域名证书、不带中间证书,多数浏览器能靠 AIA 补齐看似正常,但部分客户端(curl、Python、老旧 Android)会报证书链不完整——这是最容易被忽略的一类"我这边明明能开"的故障。
路径 B:Let's Encrypt(certbot,可自动续期)
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d www.xxxxxx.cn -d xxxxxx.cn
certbot 会自动完成 HTTP-01 校验并改你的 nginx 配置,同时装一个 systemd timer 自动续期。
优点:免费、可自动续期、支持通配符(需 DNS-01)。缺点:有效期 90 天(所以必须有自动续期),且国内部分网络对 Let's Encrypt 的 OCSP 访问不稳定,会让首次握手变慢。
选择建议:第一次上线想快速拿到结果 → 路径 A;打算长期无人值守 → 路径 B,并把 certbot renew --dry-run 加进定期检查。
三、申请时的三个决策
1. 要不要覆盖裸域名 xxxxxx.cn?
要。前提是你已经给它加了 A 记录(第 03 章)。否则验证阶段会因解析不到而失败。
现代证书的 SAN 字段可以同时包含 xxxxxx.cn 和 www.xxxxxx.cn,一份证书搞定,无需两份。
2. 用 www 还是裸域名作为主域名?
选一个作为唯一的 canonical 形式,另一个 301 跳过去。本站选 www.xxxxxx.cn 为主,理由是:
- 后续接 CDN 时,
www可以用 CNAME,裸域名不行(需要 ALIAS/Flattening) - Cookie 作用域更可控
这个选择必须在全站保持一致:canonical 标签、sitemap、og:url、内链,全部用同一个。反复横跳会让搜索引擎把两个域名当成两个站点,权重被稀释。
3. 通配符证书 *.xxxxxx.cn 有必要吗?
除非你打算开大量子域,否则没必要。通配符证书只能用 DNS-01 校验,且一旦私钥泄露影响面更大。
四、上传与存放
# 服务器建目录
sudo mkdir -p /etc/nginx/ssl
# 本地上传(scp 示例;Windows 可用 sftp/paramiko)
scp xxxxxx.cn_bundle.crt ubuntu@203.0.113.10:/tmp/
scp xxxxxx.cn.key ubuntu@203.0.113.10:/tmp/
# 服务器上就位(注意权限)
sudo mv /tmp/xxxxxx.cn_bundle.crt /etc/nginx/ssl/
sudo mv /tmp/xxxxxx.cn.key /etc/nginx/ssl/
sudo chown root:root /etc/nginx/ssl/xxxxxx.cn_bundle.crt /etc/nginx/ssl/xxxxxx.cn.key
sudo chmod 644 /etc/nginx/ssl/xxxxxx.cn_bundle.crt
sudo chmod 600 /etc/nginx/ssl/xxxxxx.cn.key # 私钥 600,绝不能更宽松
私钥权限是硬要求:chmod 600 且属主 root。权限过宽时 nginx 会直接拒绝启动并在 error log 里提示 "SSL: error: ... permissions are too open"。
五、本章验收
# 1. 看证书是谁签的、覆盖哪些域名、有效期到哪天
openssl x509 -in /etc/nginx/ssl/xxxxxx.cn_bundle.crt -noout \
-issuer -subject -dates -ext subjectAltName
# 2. 私钥与证书是否匹配(两者 public key 的 md5 必须一致)
openssl x509 -noout -pubkey -in /etc/nginx/ssl/xxxxxx.cn_bundle.crt | openssl md5
openssl rsa -noout -pubkey -in /etc/nginx/ssl/xxxxxx.cn.key | openssl md5
# 3. 权限检查
ls -l /etc/nginx/ssl/
三个检查全部通过,且 subjectAltName 里同时列出了 xxxxxx.cn 与 www.xxxxxx.cn,就可以进入下一章写 nginx 配置了。
把有效期的截止日期记进日历(免费证书通常 90 天或 1 年)。第 08 章会给一套完整的续期动作序列。