ToolkitX
知识库工具箱

HTTPS 配置

SSL 证书、Let's Encrypt、HSTS

20min·进阶

01. HTTPS = HTTP + SSL/TLS

HTTPS 就是 HTTP 加上 SSL/TLS 加密层。它的作用是: 1. 加密传输——你发的数据和服务器回的都在密文里,中间人看不到。 2. 身份验证——确认你连的是真正的服务器,不是假的钓鱼网站。 3. 数据完整性——数据在传输过程中没有被篡改。 SSL/TLS 握手过程简说:浏览器跟服务器打招呼(ClientHello),服务器发证书(ServerHello + Certificate),浏览器验证证书是不是受信任的 CA 签发的,协商出一个对称加密密钥,之后的数据都用这个密钥加密。 TLS 1.2 是主流,1.3 更新更快(握手只需 1-RTT)。建议配置 Nginx 时最低支持 TLS 1.2,关掉老的 SSLv3 和 TLS 1.0/1.1。
nginx
server {
  listen 443 ssl http2;
  server_name example.com;

  ssl_certificate     /etc/ssl/certs/example.com.crt;
  ssl_certificate_key /etc/ssl/private/example.com.key;

  ssl_protocols TLSv1.2 TLSv1.3;
  ssl_ciphers HIGH:!aNULL:!MD5;

  location / {
    root /var/www/html;
  }
}

02. Let's Encrypt 免费 SSL 证书

Let's Encrypt 是免费的 SSL 证书颁发机构,几乎所有网站都能免费获得受信任的证书。没有它之前,HTTPS 是花钱的事。 certbot 是最常用的 Let's Encrypt 客户端。它自动验证你确实拥有该域名,然后签发证书并配置 Nginx。证书有效期 90 天,需要定期续签(certbot 支持自动续签)。 HTTP 验证方式——certbot 在 Nginx 的 .well-known 目录下放一个临时文件,Let's Encrypt 的服务器通过 HTTP 访问这个文件来验证。这是最常见的验证方式,要求 80 端口能从外网访问。 DNS 验证方式——在域名 DNS 记录里添加一条 TXT 记录来验证。适合内网服务器或 80 端口开不出来的场景。支持通配符证书(*.example.com)。
bash
# 安装 certbot
sudo apt install certbot python3-certbot-nginx

# 自动配置 Nginx 并获取证书
sudo certbot --nginx -d example.com -d www.example.com

# 只获取证书不自动改 Nginx 配置
sudo certbot certonly --webroot -w /var/www/html -d example.com

# 测试续签(不实际续签)
sudo certbot renew --dry-run

# 自动续签(一般 certbot 会加一条 systemd timer 或 cron)
sudo certbot renew --quiet
certbot 安装后通常自动设好了定时任务。每隔一段时间自动尝试续签。你可以用 certbot certificates 查看所有已签发的证书及其到期时间。

03. HTTP 强制跳转 HTTPS

配置了 HTTPS 后应该把所有 HTTP 请求重定向到 HTTPS。Nginx 的配置:监听 80 端口,return 301 跳转到 https。 301 是永久重定向——浏览器会记住这个跳转,下次直接访问 HTTPS。 还有一种叫 HSTS(HTTP Strict Transport Security)——在响应头里告诉浏览器:这个网站以后只能用 HTTPS 访问,别再试 HTTP 了。Strict-Transport-Security 头就是这个意思。 HSTS 的好处:避免 SSL Strip 攻击(攻击者把 HTTPS 降级成 HTTP)。坏处:一旦设了,浏览器在有效期内(max-age)绝对不会用 HTTP 访问,证书配错了网站就打不开了。
nginx
# HTTP 跳转 HTTPS
server {
  listen 80;
  server_name example.com;
  return 301 https://$host$request_uri;
}

# HTTPS 配置(加 HSTS)
server {
  listen 443 ssl http2;
  server_name example.com;

  add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
  # max-age 单位是秒,31536000 = 1 年

  ssl_certificate     /etc/ssl/certs/example.com.crt;
  ssl_certificate_key /etc/ssl/private/example.com.key;
}
HSTS 的 includeSubDomains 会影响所有子域名。确保所有子域名都配了 HTTPS 再开这个选项,否则子域名会打不开。

04. SSL 安全配置最佳实践

正确的 SSL 配置不只是有证书就行,还需要几个安全增强: 1. 禁用老协议——只开 TLS 1.2 和 TLS 1.3,禁止所有更老的版本。ssl_protocols TLSv1.2 TLSv1.3; 2. 安全的加密套件——指定安全的 cipher 列表。用 Mozilla 推荐的 Intermediate 配置。 3. OCSP Stapling——Nginx 帮浏览器检查证书是否被吊销,省得浏览器自己去查。ssl_stapling on; 4. 安全的 Diffie-Hellman 参数——生成一个高强度的 dhparam 文件。 5. session 复用——同一个浏览器多次连接可以复用之前协商的密钥,减少握手开销。ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m;
nginx
# 完整的 SSL 安全配置
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;

# OCSP Stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/ssl/certs/example.com.chain.crt;

# DH 参数
generate: openssl dhparam -out /etc/ssl/dhparam.pem 2048
ssl_dhparam /etc/ssl/dhparam.pem;

# Session 复用
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
可以用 SSL Labs 的在线测试(ssllabs.com/ssltest)打分你的 SSL 配置。目标是 A+ 评级。

05. SSL 证书排错

证书配置出问题的常见原因: 1. 证书和私钥不匹配——用 openssl x509 -noout -modulus -in cert.crt 和 openssl rsa -noout -modulus -in key.key 对比,输出应该一样。 2. 中间证书缺失——浏览器缺少中间 CA 证书无法验证你的证书链。把多个证书按顺序拼接——你的证书在最前,中间证书在后。 3. 证书过期——用 openssl s_client -connect example.com:443 看证书有效期。certbot renew --dry-run 测试续签是否正常。 4. 域名不匹配——证书的 CN 或 SAN 里不包含你访问的域名。通配符证书 (*.example.com) 只能匹配一级子域名,不能匹配多级(a.b.example.com)。
bash
# 查看证书详情
openssl s_client -connect example.com:443 -servername example.com | openssl x509 -noout -dates

# 验证证书和私钥匹配
openssl x509 -noout -modulus -in cert.pem | openssl md5
openssl rsa -noout -modulus -in key.pem | openssl md5  # 两个 MD5 应该一样

# 查看完整证书链
openssl s_client -connect example.com:443 -showcerts

# Nginx 重新加载
sudo nginx -t && sudo nginx -s reload
在线工具 SSL Checker(sslshopper.com)也能帮你快速诊断证书问题。贴域名进去它会告诉你哪不对。

知识测验

1/5正确 0

HTTPS 提供的三大保障是什么?

下一节

Location 匹配规则

下一节