Nginx HTTPS 证书配置
HTTPS 即 HTTP + TLS 加密。部署 HTTPS 需要一份证书:向 CA 申请的证书浏览器信任(正式站点必需),自签证书仅适合测试与内网。证书到位后,在 Nginx 里监听 443 并指认证书文件即可。
证书从哪来
- 免费可信证书:Let's Encrypt 签发,用 certbot 一键申请、自动续期,前提是域名已解析到本机。
- 自签证书:openssl 本地生成,浏览器会提示"不受信任",只用于联调。
# 方式一:Let's Encrypt(需先安装 certbot)
sudo certbot --nginx -d example.com -d www.example.com
# 输出:Successfully received certificate. ...
# 方式二:自签证书(测试用,RSA 2048,有效期 365 天)
sudo mkdir -p /etc/nginx/ssl
sudo openssl req -x509 -nodes -newkey rsa:2048 -days 365 \
-keyout /etc/nginx/ssl/example.key \
-out /etc/nginx/ssl/example.crt \
-subj "/CN=example.com"
server 块启用 HTTPS
证书通常是两个文件:证书(含证书链的 .crt/.pem)与私钥 .key(私钥务必妥善保管、不要泄露):
server {
listen 443 ssl; # 监听 443 并启用 TLS
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.crt; # 证书文件路径
ssl_certificate_key /etc/nginx/ssl/example.key; # 私钥文件路径
root /var/www/site;
index index.html;
}
校验并重载后,浏览器访问 https://example.com:
sudo nginx -t && sudo systemctl reload nginx
HTTP 自动跳 HTTPS
80 端口单独一个 server 只负责 301 跳转(此写法天然避免重定向循环):
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri; # 所有 http 请求跳 https
}
SSL 参数加固建议
兼顾兼容性与安全的基本组合(TLS 版本与密码套件随 OpenSSL 版本略有差异,此处给通用简写):
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /etc/nginx/ssl/example.crt;
ssl_certificate_key /etc/nginx/ssl/example.key;
ssl_protocols TLSv1.2 TLSv1.3; # 禁用更老的 TLSv1/TLSv1.1
ssl_ciphers HIGH:!aNULL:!MD5; # 通用安全套件简写
ssl_prefer_server_ciphers on; # 优先服务端套件顺序
ssl_session_cache shared:SSL:10m; # 会话缓存,减少重复握手
ssl_session_timeout 10m;
}
OCSP 与 HTTP/2(简提)
- OCSP 装订(ssl_stapling on)让 Nginx 代替浏览器向 CA 查询证书状态,可加快握手;
- HTTP/2 通过多路复用显著提速,在 listen 后追加 http2 参数即可(需编译时带 http_v2 模块)。
两者(含完整配置写法)的细节将在第 14 章 HTTP/2 章节展开,这里先知道概念即可。
验证 HTTPS
证书链与协商结果用 openssl s_client 检查:
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null \
| grep -E "subject=|issuer=|Protocol|Cipher"
# 输出示例:subject=CN=example.com
# Protocol : TLSv1.3
# Cipher : TLS_AES_256_GCM_SHA384
浏览器地址栏出现锁形图标即部署成功;自签证书需在客户端手动信任。
小结:HTTPS 部署 = 证书准备(certbot 或自签)+ listen 443 ssl + ssl_certificate/ssl_certificate_key 指认证书 + 80 端口 return 301 跳转,最后用 openssl s_client 验证协商结果。HTTP/2 提速配置见第 14 章。