nginx 配置 ssl certificate ssl certificate key

热点 2026-10-17 04:18:14 43145

打开 /etc/nginx/nginx.conf 或者 /etc/nginx/conf.d/your-site.conf,找到 server 块。你要加的东西就两行:ssl_certificate 和 ssl_certificate_key。别小看这两行,配错了 nginx 直接起不来,浏览器给你甩一个 NET::ERR_CERT_AUTHORITY_INVALID,用户扭头就走。

先看一个能跑的最小配置:

server {  listen 443 ssl; server_name example.com; ssl_certificate /etc/nginx/ssl/example.com.crt; ssl_certificate_key /etc/nginx/ssl/example.com.key; location / {  root /var/www/html; index index.html; } }

ssl_certificate 指向的是证书文件,通常是 .crt 或 .pem 后缀。这个文件里可能不止一张证书——很多 CA 会给你一个 fullchain 文件,里面是你的域名证书加上中间 CA 证书。nginx 从 1.11.0 开始就支持这种拼接格式,直接指向 fullchain 文件就行,不用单独配中间证书。

ssl_certificate_key 指向私钥文件,后缀一般是 .key。这个文件绝对不能泄露。我见过有人把私钥放在网站根目录下,结果被扫描器抓走,整个域名被人拿去签了钓鱼站。私钥文件的权限设成 600,属主是 nginx 进程的运行用户或者 root。

有个细节容易被忽略:ssl_certificate 和 ssl_certificate_key 可以在 http、server 两个层级配置。如果你有多个域名共用一个泛域名证书,把这两行写在 http 块里更省事。但不同域名用不同证书的时候,还是老老实实写在各自的 server 块里。

配完之后 nginx -t 测试一下。常见报错就那几种:cannot load certificate 说明路径写错了或者文件不存在;PEM_read_bio_X509_AUX() failed 说明证书格式不对,可能你把 DER 格式的文件直接扔进去了;key values mismatch 最坑,证书和私钥不匹配——你可能把 A 域名的证书配了 B 域名的私钥。用 openssl x509 -noout -modulus -in cert.crt | md5 和 openssl rsa -noout -modulus -in cert.key | md5 对比一下两个哈希值,不一样就说明配错了。

证书链的问题也值得说一句。有些 CA 给的证书文件只包含你的域名证书,不包含中间证书。nginx 不会自动去补全这条链。浏览器拿到不完整的链,某些情况下会报错,尤其是 Android 上的老版本 WebView。检查方法:openssl s_client -connect example.com:443 -showcerts,看返回的证书数量。只有一张就是缺中间证书。

还有 OCSP Stapling。配了 SSL 之后顺手加上这几行:

ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/nginx/ssl/chain.pem; resolver 8.8.8.8 1.1.1.1 valid=300s; resolver_timeout 5s;

ssl_trusted_certificate 指向的 chain.pem 是 CA 的根证书和中间证书集合。没有这个文件的话,OCSP Stapling 不会生效,nginx 日志里会默默记一条警告。效果是浏览器不用自己去 CA 那边查吊销状态,TLS 握手少一个 RTT。

证书续期别忘了。Let's Encrypt 的证书 90 天过期,certbot 会自动改 nginx 配置,但如果你手动配的路径,续期之后文件没变就不用 reload。要是用了 --standalone 模式,续期时 certbot 会临时占用 80 端口,nginx 得先停一下。我一般用 --webroot 模式,续期不影响线上服务,reload 一下 nginx 就行。

最后提一个我踩过的坑:nginx 配置里写了 ssl_certificate 但忘了 listen 443 ssl 里的 ssl 参数。nginx 不会报错,443 端口能通,但走的还是 HTTP 明文。用 curl -v https://example.com 一看,SSL connection 那行根本没出现。这种静默失败最要命,配置改完记得用 curl 或者 openssl s_client 验证一下实际握手行为。

本文地址:http://www.79wt.cn/news/728b9599176.html
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

友情链接