4.Nginx HTTPS 部署与证书管理

2026年6月10日 Nginx 11 分钟阅读 2 次阅读
📖 文章摘要

讲解 Ubuntu 下 Certbot 一键申请免费 SSL 证书,Nginx 配置 HTTPS 强制跳转,包含证书自动续期、端口放行全套实操命令。

Nginx HTTPS 部署与证书管理

一、HTTPS 基础概念

为什么需要 HTTPS

HTTP 是明文传输,中间人可以窃听、篡改数据。HTTPS = HTTP + TLS 加密,保证:

  • 机密性:数据加密,第三方看不到内容
  • 完整性:数据不会被篡改
  • 身份验证:浏览器能确认网站是真的 demo.test.com,不是钓鱼网站

HTTPS 和 HTTP 的区别

对比 HTTP HTTPS
端口 80 443
加密 TLS 加密
证书 不需要 需要 SSL 证书
浏览器显示 不安全警告 地址栏锁图标

二、TLS 握手流程

1. 浏览器访问 https://demo.test.com
2. Nginx 收到请求,发现是 443 端口
3. Nginx 把证书(fullchain.pem,含公钥)发给浏览器
4. 浏览器验证证书:
   - 这个证书是签发给 demo.test.com 的吗?→ 是
   - 证书过期了吗?→ 没有
   - 签发机构(Let's Encrypt)可信吗?→ 可信
5. 浏览器自己生成一个随机的对称密钥
6. 浏览器用 Nginx 的公钥加密这个对称密钥,发给 Nginx
7. Nginx 用私钥(privkey.pem)解密,拿到对称密钥
8. 之后双方用这个对称密钥加密所有通信数据

为什么用非对称加密交换密钥,之后用对称加密?

非对称加密很慢,对称加密很快。所以只在握手阶段用非对称加密交换一个密钥,之后全部用对称加密——兼顾安全和性能。


三、证书文件详解

fullchain.pem(证书/公钥)

  • 包含:你网站的公钥 + 中间 CA 证书 + 根证书(完整证书链)
  • 用途:发给浏览器,让浏览器验证网站身份
  • 位置:/etc/letsencrypt/live/demo.test.com/fullchain.pem

privkey.pem(私钥)

  • 包含:你网站的私钥
  • 用途:服务器用来解密浏览器发来的对称密钥
  • 位置:/etc/letsencrypt/live/demo.test.com/privkey.pem
  • 绝对不能泄露! 泄露了等于 HTTPS 形同虚设

cert.pem(网站证书,不含证书链)

  • 只包含你网站的证书,不含中间 CA 证书
  • 一般用 fullchain.pem 而不是 cert.pem,避免浏览器验证时找不到中间证书

四、Nginx HTTPS 配置(博客的实际配置)

server {
    server_name demo.test.com www.demo.test.com;
    listen 443 ssl;                              # 监听 443 端口,启用 SSL
    ssl_certificate /etc/letsencrypt/live/demo.test.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/demo.test.com/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
    ...
}

server {
    listen 80;                                   # HTTP 端口
    server_name demo.test.com www.demo.test.com ...;
    return 301 https://$server_name$request_uri; # 强制跳转 HTTPS
}

逐行解释

指令 作用
listen 443 ssl 监听 443 端口,启用 TLS 加密
ssl_certificate 证书文件路径(公钥+证书链),发给浏览器验证
ssl_certificate_key 私钥文件路径,服务器用来解密
include options-ssl-nginx.conf 引入 certbot 自动生成的安全 SSL 参数
ssl_dhparam Diffie-Hellman 参数文件,增强密钥交换安全性
listen 80 + return 301 HTTP 强制跳转 HTTPS

为什么 listen 80 要 301 跳转?

用户在浏览器输入 http://demo.test.com(注意是 http),请求会走到 listen 80 的 server 块。如果不做跳转,用户就一直停在不安全的 HTTP 上。

return 301 https://$server_name$request_uri; 告诉浏览器:"你该用 https",浏览器收到 301 后自动跳转到 https://demo.test.com。


五、certbot 的 SSL 安全参数

/etc/letsencrypt/options-ssl-nginx.conf 文件内容:

ssl_session_cache shared:le_nginx_SSL:10m;      # SSL 会话缓存,10MB 共享内存
ssl_session_timeout 1440m;                       # 会话超时 24 小时
ssl_session_tickets off;                         # 关闭 session ticket(更安全)

ssl_protocols TLSv1.2 TLSv1.3;                  # 只允许 TLS 1.2 和 1.3
ssl_prefer_server_ciphers off;                   # 不强制服务端选择加密套件

ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:..."; # 允许的加密算法

核心要点

  • 只允许 TLS 1.2 和 1.3:老的 SSLv3、TLS 1.0/1.1 已经不安全,不支持
  • 加密算法用 GCM 模式:目前最安全的对称加密方式
  • ssl_session_cache:缓存 SSL 会话,避免每次连接都重新握手(性能优化)
  • ssl_session_tickets off:关闭 session ticket 可防止某些攻击,安全性更高

六、Let's Encrypt + certbot 工作机制

Let's Encrypt 是什么

免费的 SSL 证书颁发机构(CA)。以前 SSL 证书要花钱买,Let's Encrypt 让任何人都能免费获得可信证书。

certbot 是什么

自动化的证书管理工具,帮你完成:申请证书 → 配置 Nginx → 自动续期。

申请证书的完整流程

1. 你执行:certbot --nginx -d demo.test.com -d www.demo.test.com

2. certbot 向 Let's Encrypt 证明你拥有这个域名:
   - Let's Encrypt 在你的网站根目录放一个验证文件
   - Let's Encrypt 访问 http://demo.test.com/.well-known/acme-challenge/xxx
   - 如果能访问到 → 证明你控制这个域名
   - 验证通过

3. Let's Encrypt 签发证书

4. certbot 自动把证书路径写入 Nginx 配置

5. certbot 自动设置定时续期任务

自动续期机制(systemd timer)

本博客的服务器用的是 systemd timer 方式:

systemctl cat certbot.timer
OnCalendar=*-*-* 00,12:00:00     # 每天 0:00 和 12:00 各检查一次
RandomizedDelaySec=43200          # 随机延迟 0~12 小时(避免所有服务器同时请求)
Persistent=true                   # 错过执行时间,开机后补执行
ExecStart=/usr/bin/certbot -q renew --no-random-sleep-on-renew
# -q 静默模式
# renew 检查所有证书,如果剩余有效期 < 30 天就自动续期

查看证书信息

# 查看证书到期时间
sudo certbot certificates

# 手动测试续期(不实际执行)
sudo certbot renew --dry-run

七、HTTPS 完整请求链路

用户输入 https://demo.test.com

浏览器 → DNS 解析 → shturl.cc/OFB6
       → TCP 三次握手(端口 443)
       → TLS 握手:
           Nginx 发送 fullchain.pem
           浏览器验证证书
           浏览器生成对称密钥,用公钥加密发给 Nginx
           Nginx 用 privkey.pem 解密
       → HTTP 请求(对称加密)
           Nginx 匹配 location → 转发给后端
       → 返回响应(对称加密)
       → 浏览器渲染页面

八、问答

Q:HTTPS 是怎么工作的?
浏览器发请求 → Nginx 发送证书(公钥) → 浏览器验证证书 → 浏览器生成对称密钥用公钥加密发给服务器 → 服务器用私钥解密 → 之后用对称密钥加密通信。

Q:为什么用非对称加密交换密钥,之后用对称加密?
非对称加密慢,对称加密快。握手阶段用非对称加密交换密钥,之后用对称加密传输数据,兼顾安全和性能。

Q:SSL 证书怎么来的?
Let's Encrypt 免费签发,certbot 工具自动申请。certbot 会验证你拥有这个域名,通过后自动签发证书并配置 Nginx。

Q:证书怎么续期?
certbot 设置了 systemd timer,每天检查两次,如果证书剩余有效期不足 30 天就自动续期。无需手动操作。

Q:listen 80 和 listen 443 的关系?
80 是 HTTP 端口,443 是 HTTPS 端口。listen 80 的 server 块做 301 跳转到 HTTPS,listen 443 ssl 的 server 块处理正式请求。

Q:fullchain.pem 和 privkey.pem 分别是什么?
fullchain.pem 是证书(含公钥和证书链),发给浏览器验证身份。privkey.pem 是私钥,服务器用来解密浏览器发来的对称密钥。私钥绝对不能泄露。

说明:文中域名、IP均为教学演示虚拟地址,无真实线上服务

最后更新:2026年7月9日CC BY-NC-SA 4.0

评论

暂无评论,来写第一条吧

© 2026 My Blog. Built with Nuxt.js + FastAPI.