云服务器运维与项目部署
13.9 SSL证书配置实战
Tip
在 Serverless 环境下平台帮我们搞定了 SSL。但在 VPS 上,你需要自己申请、自己配置 Nginx,还要自己搞定续期。
1. 为什么要学这个?
你买了个域名,解析到了 VPS。
访问 http://domain.com 正常。
访问 https://domain.com 打不开。
Chrome 提示“不安全”,红色的警告把用户吓跑了。
你需要给你的 VPS 颁发一张“身份证”。
2. 核心概念:ACME 协议
ACME 是 Let's Encrypt 提供的自动化验证协议。
- Challenge: LE 给你的服务器发个“试卷”(一个随机文件)。
- Verify: 你的 Nginx 把“试卷”展示在
http://domain.com/.well-known/acme-challenge/下。 - Issue: LE 访问这个地址,发现答案正确,颁发证书。
3. 解决方案 (HOW)
3.1 方案 A:1Panel 全自动 (推荐)
如果你装了 13.4 的 1Panel 面板:
- 进入“网站” -> “证书”。
- 点击“申请证书”。
- 输入域名,选择“ACME 账户”。
- Confirm. 面板会自动修改 Nginx 配置,并自动建立定时任务续期。小白首选。
3.2 方案 B:ACME.sh 脚本 (极客)
如果你喜欢命令行,acme.sh 是最强的工具。
# 1. 安装
curl https://get.acme.sh | sh
# 2. 申请证书 (使用 Nginx 模式)
acme.sh --issue -d mydomain.com --nginx
# 3. 安装证书到指定目录
acme.sh --install-cert -d mydomain.com \
--key-file /etc/nginx/ssl/key.pem \
--fullchain-file /etc/nginx/ssl/cert.pem \
--reloadcmd "service nginx force-reload"
3.3 证书申请流程图
graph TD
User["VPS (acme.sh/1Panel)"] -->|"Step 1: 申请"| CA["Let's Encrypt (CA)"]
CA -->|"Step 2: 随机 Token"| User
User -->|"Step 3: 暴露 Token (HTTP)"| Web["Nginx (.well-known)"]
CA -->|"Step 4: 验证 Token"| Web
CA --"Step 5: 验证通过"--> Issue["颁发证书 (.pem)"]
Issue -->|"Step 6: 部署"| Nginx["Nginx"]
style CA fill:#fff9c4,stroke:#fbc02d
style Issue fill:#c8e6c9,stroke:#2e7d32
4. 避坑指南
| ❌ 不要这样做 | ✅ 应该这样做 | 为什么 |
|---|---|---|
| 封锁 80 端口 | 开放 80 端口 | ACME 验证必须走 HTTP 80 端口。如果安全组封了,Let's Encrypt 访问不到你的“试卷”,证书永远申请不下来。 |
| 盲目泛域名 | 单域名证书 | 申请 *.example.com 需要配置 DNS API,非常复杂。如果你只有 www 和 @,直接申请包含这两个的单域名证书即可,简单 10 倍。 |
| 坚持 RSA | 拥抱 ECC | ECC 证书更小、更快、更安全,是现代标准。 |
5. 真实案例
Story
2022年,Nginx 的 404
很多开发者申请证书失败,报错 Verify error: 404。
排查了一下午,发现是 Nginx 配置里写了 location / { return 301 https://$host$request_uri; }。
导致 Let's Encrypt 访问 .well-known 时被强制跳转到了 HTTPS,而此时 HTTPS 证书还没申请下来,连接失败。
Vibe 心法:80 端口是 ACME 验证的必经之路。在追求全站强制 HTTPS 的过程中,不要把自己锁在门外。确保 .well-known 目录的请求能被优先处理,不被全局跳转规则误杀。
6. 本章小结
- 1Panel:让证书申请变成了“点击一下”。
- 80 Port:是证书验证的必经之路。
- Automation:没有自动续期的证书,早晚会过期。