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 年,到期需重新申请)。

流程:

  1. 控制台 → SSL 证书 / 证书管理 → 申请免费证书
  2. 填域名:www.xxxxxx.cn(先只签 www,后面再决定要不要加裸域名)
  3. 选择验证方式:
    • 自动 DNS 验证(域名在同一家云厂商时最省事):系统自动加 TXT 记录
    • 手动 DNS 验证:按提示给你的域名加一条 _acme-challenge 或指定的 TXT 记录,等生效后点验证
    • 文件验证(HTTP-01):下载一个验证文件放到服务器指定路径
  4. 签发完成后选择「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 为主,理由是:

这个选择必须在全站保持一致: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 章会给一套完整的续期动作序列。

进入 keel 阅读