nginx 启用 https 需正确配置 ssl_certificate(指向 fullchain.pem)和 ssl_certificate_key(指向 privkey.pem),确保路径有效、权限为 600、内容完整且无密码;还需启用 tlsv1.2+、http/2 和 hsts,并通过 nginx -t 验证配置。

要让 Nginx 正确启用 HTTPS,ssl_certificate 和 ssl_certificate_key 这两个指令必须配对使用,且路径、权限、内容完整性缺一不可。配置本身不难,但细节出错会导致 400 错误、Nginx 启动失败或浏览器提示“连接不安全”。
证书文件路径与内容要求
ssl_certificate 指向的不是单个域名证书,而是完整证书链文件(通常叫 fullchain.pem 或 example.com_bundle.crt),它需包含:域名证书 + 所有中间证书。若只放域名证书(example.com.crt),iOS、部分安卓设备和旧版 Chrome 会因信任链断裂而报错。
- 推荐命名与存放位置:
/etc/nginx/ssl/example.com/fullchain.pem(证书链)、/etc/nginx/ssl/example.com/privkey.pem(私钥) - 不要把证书丢在
/root或用户家目录——Nginx 工作进程无权读取 - 若用 Let’s Encrypt,certbot 默认生成的
fullchain.pem就符合要求;手动部署时请确认文件内容顺序正确
私钥权限与安全性设置
私钥文件必须严格限制访问权限,否则 Nginx 会拒绝加载并报 “permission denied”。这不是警告,是硬性校验。
- 执行:
sudo chmod 600 /etc/nginx/ssl/example.com/privkey.pem - 确保属主是 root(
sudo chown root:root …),避免其他用户读取 - 切勿对私钥加密码保护(如
-des3生成的加密 key),否则每次 Nginx 启动/重载都要手动输密码,无法用于生产环境
Nginx 配置中的关键项
仅写 ssl_certificate 和 ssl_certificate_key 不足以获得现代浏览器认可的安全连接。还需基础加固项:
-
listen 443 ssl http2;—— 启用 HTTPS 并支持 HTTP/2(需 Nginx ≥1.9.5) -
ssl_protocols TLSv1.2 TLSv1.3;—— 禁用已不安全的 TLSv1.0/TLSv1.1 -
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;—— 启用 HSTS,强制后续访问走 HTTPS - 务必检查
server_name与证书绑定的域名完全一致(包括 www 与否)
验证与排错要点
改完配置别急着 reload,先做两件事:
- 运行
sudo nginx -t:检查语法是否正确、路径是否存在、权限是否可读 - 用
curl -I https://example.com或浏览器开发者工具 → 安全标签页,确认证书有效期、颁发者、是否含完整链 - 常见报错:
SSL_CTX_use_PrivateKey_file() failed多为私钥权限不对;no "ssl_certificate" is defined是 server 块里漏写了 listen 443 ssl 或指令拼错











