外观
3.2 证书与 HTTPS 配置
约 876 字
Nginx证书
本页对应「三、操作步骤」的 3.2,完成证书与 HTTPS 配置。返回上级:Nginx 反向代理配置指南。
前置条件
- 3.1 已完成,HTTP 站点可正常返回 200,
nginx -t无报错。 - 证书文件已由证书流程签发,含全链证书与私钥,且私钥未设置密码短语。
- 安全组与 ufw 已放通 443,本机已安装 openssl。
- 已确认证书覆盖的域名,至少包含 example.com 与 www.example.com。
- 已确认 443 端口未被其他服务占用,
ss -lntp中该端口空闲。
操作步骤
- 存放证书并收紧权限。私钥仅 root 可读,nginx master 以 root 启动,能够读取 600 文件。
sudo mkdir -p /etc/nginx/ssl
sudo install -m 644 -o root -g root fullchain.pem /etc/nginx/ssl/example.com.fullchain.pem
sudo install -m 600 -o root -g root privkey.pem /etc/nginx/ssl/example.com.key
sudo ls -l /etc/nginx/ssl/- 校验证书与私钥匹配、有效期与域名覆盖。三者任一不符都会在重载后表现为握手失败。
openssl x509 -in /etc/nginx/ssl/example.com.fullchain.pem -noout -subject -dates
openssl rsa -in /etc/nginx/ssl/example.com.key -check -noout- 修改站点配置:80 只做跳转,443 承载业务。把 3.1 中的 80 server 块改为如下内容,并追加 443 块。
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
http2 on;
server_name example.com www.example.com;
ssl_certificate /etc/nginx/ssl/example.com.fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/example.com.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
add_header Strict-Transport-Security "max-age=31536000" always;
location / {
proxy_pass http://axis_app;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
}
}- 校验配置,不要跳过这一步直接重载。重载失败会导致整个站点不可用,而不只是 HTTPS 不可用。
sudo nginx -t- 重载后从外部验证握手与证书链。
-servername必须指定,否则可能拿到默认站点的证书。
sudo systemctl reload nginx
openssl s_client -connect example.com:443 -servername example.com -showcerts </dev/null 2>/dev/null | openssl x509 -noout -issuer -dates结果确认
nginx -t通过,无cannot load certificate或key values mismatch提示。openssl s_client输出签发者与到期日,subject 覆盖 example.com 与 www,到期日与签发周期相符。- 完整握手输出中证书段不少于 2 段,说明中间证书已随链下发。
curl -sSI https://example.com返回 200,且响应头含strict-transport-security。curl -sSI http://example.com返回 301 且 Location 为 https 地址,说明跳转生效。curl -sS -o /dev/null -w '%{http_code}\n' https://www.example.com返回 200,说明证书与 server_name 均覆盖带 www 的主机名。
注意事项
ssl_certificate必须指向 fullchain 文件,只用叶子证书会在部分客户端报链不完整,桌面浏览器往往不报错而移动端报错。- 私钥权限 600 且属主 root;worker 进程以 www-data 运行不需要读取私钥,master 读取一次后即可。
- HSTS 一旦下发,浏览器在 max-age 内强制 HTTPS;测试期先用 300 秒,确认无误再上调,否则回退窗口会被浏览器自身锁死。
- 证书更新后必须重载 Nginx,否则内存中仍是旧证书,现象是文件已换但浏览器仍显示旧到期日。
- 若前置 CDN,证书需同时配置在边缘节点,仅源站配置不会改变浏览器看到的证书。
- 若证书由 ACME 客户端自动续期,路径应直接指向 live 目录下的软链,不要复制到 /etc/nginx/ssl 后固定,否则续期后 Nginx 仍读旧文件。
- 443 server 块中的
http2 on需要较新版本的 nginx,旧版本写作listen 443 ssl http2;,版本不匹配会在nginx -t时报未知指令。