Nginx 配置 SSL 证书:5分钟搞定,再也不怕绿锁变红叉
分类:互联网热点
编辑:做网站
浏览量:210
2026-05-22 18:10:25
【导读】Nginx 配置 SSL 证书的本质,是让加密通道与服务进程达成一次安静握手——不惊扰现有连接,不打断用户访问,更不能让浏览器突然弹出「您的连接不是私密连接」。
动手前必须确认的三件事
别急着改配置,先看这三项是否成立:
- OpenSSL 版本 ≥ 1.1.1f(低于此版本无法支持TLSv1.3及ALPN扩展);
- Nginx 编译时已启用 --with-http_ssl_module(执行 nginx -V 查看输出中是否有该项);
- 待部署的私钥文件权限为 400(chmod 400 domain.key),且属主为 nginx worker 进程运行用户(通常是 www-data 或 nginx)。
任一条件不满足,sudo nginx -t 可能通过,但 systemctl reload nginx 会悄无声息失败,worker 进程仍用旧配置跑着。
正确组装你的证书链(90%的问题出在这)
你收到的证书包通常含 three files:
- domain.crt :站点主体证书;
- ca-bundle.pem 或 chain.pem :中间证书链;
- domain.key :私钥(如自行生成则已有)。
⚠️ 错误示范:
✘ 直接把 root CA 也放进 chain.pem → 导致 iOS Safari 报 CERT_HAS_EXPIRED;
✘ 漏掉二级中间证书 → Chrome DevTools Security 标签页显示“Incomplete Certificate Chain”;
✘ CRT 和 KEY 文件编码格式混用(ANSI vs UTF-8 BOM)→ Nginx 启动报 unknown directive “ssl_certificate”。
✅ 正确做法:
cat domain.crt ca-bundle.pem > /etc/nginx/ssl/fullchain.pem
并用 openssl x509 -in fullchain.pem -text -noout | grep 'Issuer:' 确认输出恰好两行(不含根)。
Nginx 配置 SSL 证书的标准五步法
这是经千次生产验证过的最小可行路径:
备份原 conf 块与证书文件(推荐带日期戳:cp ssl.conf ssl.conf.bak.$(date +%Y%m%d));
将新的 domain.key 放入 /etc/nginx/ssl/private/,设置权限 chmod 400;
合成完整证书链:cat domain.crt ca-bundle.pem > /etc/nginx/ssl/fullchain.pem;
修改 server {} 区块内的 ssl_certificate 和 ssl_certificate_key 指向新路径;
执行 sudo nginx -t && sudo systemctl reload nginx(不用 restart!)。
其中第5步最关键:“reload”只会平滑重启 worker 进程,不影响现有 TCP 连接;而“restart”会导致毫秒级请求丢弃,电商类网站高峰期慎用。
常见故障速查表
如果浏览器提示 NET::ERR_CERT_AUTHORITY_INVALID 或 curl 返回 Peer's Certificate issuer is not recognized,请按顺序排查:
- fullchain.pem 是否漏掉中间证书?→ 使用 https://decoder.link/certchecker 在线解析查看 Issuer Chain 层级;
- 私钥与公钥是否匹配?→ 执行 openssl x509 -noout -modulus -in domain.crt | md5 和 openssl rsa -noout -modulus -in domain.key | md5 对比结果;
- SSL 协议启用范围是否过窄?→ conf 中误删 ssl_protocols TLSv1.2 TLSv1.3; 导致低版本 Android WebView 拒绝协商。
建议每次更新后立即跑一遍 curl -I --resolve example.com:443:127.0.0.1 https://example.com ,观察 Header 是否有 Strict-Transport-Security 字段回显。
进阶技巧:让 Nginx 配置 SSL 证书更稳更省心
规模化运维场景下,还可借助这些实践提效:
- 使用 acme.sh 配合 cron 定时自动轮转 Let’s Encrypt 证书,并绑定 post-hook 脚本触发 nginx reload;
- 在 Ansible Playbook 中定义 template 变量 {{ cert_path }}/{{ key_path }},实现跨集群统一批量下发;
- 启用 ngx_http_stub_status_module 暴露 $ssl_protocol $ssl_cipher 指标,接入 Prometheus 做变更前后加密套件分布监控。
至此,你就掌握了 Nginx 配置 SSL 证书从入门到稳态交付的全链条技能树。
动手前必须确认的三件事
别急着改配置,先看这三项是否成立:
- OpenSSL 版本 ≥ 1.1.1f(低于此版本无法支持TLSv1.3及ALPN扩展);
- Nginx 编译时已启用 --with-http_ssl_module(执行 nginx -V 查看输出中是否有该项);
- 待部署的私钥文件权限为 400(chmod 400 domain.key),且属主为 nginx worker 进程运行用户(通常是 www-data 或 nginx)。
任一条件不满足,sudo nginx -t 可能通过,但 systemctl reload nginx 会悄无声息失败,worker 进程仍用旧配置跑着。
正确组装你的证书链(90%的问题出在这)
你收到的证书包通常含 three files:
- domain.crt :站点主体证书;
- ca-bundle.pem 或 chain.pem :中间证书链;
- domain.key :私钥(如自行生成则已有)。
⚠️ 错误示范:
✘ 直接把 root CA 也放进 chain.pem → 导致 iOS Safari 报 CERT_HAS_EXPIRED;
✘ 漏掉二级中间证书 → Chrome DevTools Security 标签页显示“Incomplete Certificate Chain”;
✘ CRT 和 KEY 文件编码格式混用(ANSI vs UTF-8 BOM)→ Nginx 启动报 unknown directive “ssl_certificate”。
✅ 正确做法:
cat domain.crt ca-bundle.pem > /etc/nginx/ssl/fullchain.pem
并用 openssl x509 -in fullchain.pem -text -noout | grep 'Issuer:' 确认输出恰好两行(不含根)。
Nginx 配置 SSL 证书的标准五步法
这是经千次生产验证过的最小可行路径:
备份原 conf 块与证书文件(推荐带日期戳:cp ssl.conf ssl.conf.bak.$(date +%Y%m%d));
将新的 domain.key 放入 /etc/nginx/ssl/private/,设置权限 chmod 400;
合成完整证书链:cat domain.crt ca-bundle.pem > /etc/nginx/ssl/fullchain.pem;
修改 server {} 区块内的 ssl_certificate 和 ssl_certificate_key 指向新路径;
执行 sudo nginx -t && sudo systemctl reload nginx(不用 restart!)。
其中第5步最关键:“reload”只会平滑重启 worker 进程,不影响现有 TCP 连接;而“restart”会导致毫秒级请求丢弃,电商类网站高峰期慎用。
常见故障速查表
如果浏览器提示 NET::ERR_CERT_AUTHORITY_INVALID 或 curl 返回 Peer's Certificate issuer is not recognized,请按顺序排查:
- fullchain.pem 是否漏掉中间证书?→ 使用 https://decoder.link/certchecker 在线解析查看 Issuer Chain 层级;
- 私钥与公钥是否匹配?→ 执行 openssl x509 -noout -modulus -in domain.crt | md5 和 openssl rsa -noout -modulus -in domain.key | md5 对比结果;
- SSL 协议启用范围是否过窄?→ conf 中误删 ssl_protocols TLSv1.2 TLSv1.3; 导致低版本 Android WebView 拒绝协商。
建议每次更新后立即跑一遍 curl -I --resolve example.com:443:127.0.0.1 https://example.com ,观察 Header 是否有 Strict-Transport-Security 字段回显。
进阶技巧:让 Nginx 配置 SSL 证书更稳更省心
规模化运维场景下,还可借助这些实践提效:
- 使用 acme.sh 配合 cron 定时自动轮转 Let’s Encrypt 证书,并绑定 post-hook 脚本触发 nginx reload;
- 在 Ansible Playbook 中定义 template 变量 {{ cert_path }}/{{ key_path }},实现跨集群统一批量下发;
- 启用 ngx_http_stub_status_module 暴露 $ssl_protocol $ssl_cipher 指标,接入 Prometheus 做变更前后加密套件分布监控。
至此,你就掌握了 Nginx 配置 SSL 证书从入门到稳态交付的全链条技能树。
声明:免责声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,也不承认相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,请发
送邮件至:operations@xinnet.com进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。本站原创内容未经允许不得转载,或转载时
需注明出处:新网idc知识百科
