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

HTTPS 链路与 301 跳转 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 章。

笔记加载中…