06-HTTPS证书全套配置:SSL部署、强制跳转、证书续期、安全加固 06-HTTPS证书全套配置SSL部署、强制跳转、证书续期、安全加固大家好我是黒漂技术佬。上一篇我们把跨域问题彻底搞定了但还有个同样让人头疼的东西——HTTP 地址栏上那个 “不安全” 的红色警告。你的售货柜小程序如果走 HTTP微信直接拒接浏览器也会给你标个醒目的 “Not Secure”。没办法HTTPS 已经是现代 Web 的标配。今天这篇咱们从 TLS 握手原理讲到 SSL 证书部署、自动续期再到 HSTS 安全加固一次性配到位。一、HTTPS 到底干了什么——TLS 握手流程简述HTTPS HTTP SSL/TLS。TLS 是传输层安全协议在 HTTP 的 TCP 连接之上加了一层加密。我们先花几分钟搞懂 TLS 握手流程这对后面排错特别有帮助。TLS 1.2 握手简版 4 步Client Hello浏览器发起请求带上自己支持的加密套件列表比如支持哪些对称加密算法、哈希算法、TLS 版本号以及一个随机数 Random_C。Server Hello 证书服务器选一个双方都支持的加密套件返回自己的随机数 Random_S然后把 SSL 证书公钥在里面发给浏览器。密钥交换浏览器生成一个 Pre-Master Secret用服务器公钥加密后发给服务器。然后浏览器和服务器各自用 Random_C Random_S Pre-Master Secret通过 PRF 算法算出同一个会话密钥。这一步之后双方的对称加密密钥就一致了。加密通信开始双方各自发一个 Finished 消息用会话密钥加密验证握手成功。之后所有数据都用这个会话密钥进行对称加密。TLS 1.3 进一步简化了握手流程去掉了一些不安全算法实现了 0-RTT零往返但对本文读者来说理解 TLS 1.2 的流程就够了。这里有个关键点非对称加密只在握手阶段交换会话密钥真正传输数据的对称加密用的是会话密钥——因为非对称加密太慢了全量加密扛不住。这种设计叫混合加密。二、SSL 证书怎么搞——Let’s Encrypt 免费证书 vs 商业证书Let’s Encrypt免费、自动化、90 天有效期。通过 certbot 或 acme.sh 工具自动申请和续期。对于中小项目、内部系统、个人博客来说完全够用。我们售货柜系统到 2025 年都用这个。商业证书如 DigiCert、GeoTrust几千到几万块一年有效期 1 年提供更高级别的验证OV 组织验证、EV 扩展验证地址栏会显示公司名称并且有保险兜底——如果证书出问题导致用户损失CA 会赔付。一般银行、电商平台才需要。对于我们无人售货柜这种 IoT SaaS 场景Let’s Encrypt 完全够用。certbot 申请证书流程# 安装 certbotUbuntu/Debianaptinstallcertbot python3-certbot-nginx-y# 申请证书需要域名已解析到当前服务器且 80 端口对外开放certbot certonly--nginx-dadmin.smartkaba.com-dapi.smartkaba.com-ddevice.smartkaba.com# 证书位置# 证书/etc/letsencrypt/live/admin.smartkaba.com/fullchain.pem# 私钥/etc/letsencrypt/live/admin.smartkaba.com/privkey.pemcertbot 会通过 ACME 协议验证你对域名的所有权——它会在服务器上临时起一个 HTTP 服务Let’s Encrypt 的验证服务器访问你域名的 80 端口确认你确实拥有这台服务器验证通过后签发证书。三、Nginx SSL 配置——从基础到安全评分 A基础 SSL 配置server { listen 443 ssl http2; server_name admin.smartkaba.com; ssl_certificate /etc/letsencrypt/live/admin.smartkaba.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/admin.smartkaba.com/privkey.pem; # 只启用 TLS 1.2 和 1.3关闭不安全的 SSLv3 和 TLS 1.0/1.1 ssl_protocols TLSv1.2 TLSv1.3; # 加密套件优先服务器端选择 ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers on; # 启用 DH 参数增强密钥交换安全性 ssl_dhparam /etc/nginx/dhparam.pem; # OCSP Stapling服务器缓存 OCSP 响应减少客户端验证延迟 ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/letsencrypt/live/admin.smartkaba.com/chain.pem; resolver 8.8.8.8 114.114.114.114 valid300s; resolver_timeout 5s; location / { root /var/www/admin-web/dist; try_files $uri $uri/ /index.html; } location /api/ { proxy_pass http://gateway:8080/api/; proxy_set_header X-Forwarded-Proto $scheme; } }字段详解ssl_protocols只开启 TLS 1.2关闭 TLS 1.0/1.1 这些已被认为不安全的版本。ssl_ciphers按安全性排列加密套件ECDHE开头的是基于椭圆曲线的密钥交换算法性能好且支持前向保密即使私钥泄露历史通信仍无法解密。ssl_dhparamDiffie-Hellman 参数文件使用 2048 位或更高。生成方法openssl dhparam -out /etc/nginx/dhparam.pem 2048。OCSP Stapling正常 TLS 握手时浏览器还要去向 CA 查询证书是否被吊销——这多了一次网络开销。OCSP Stapling 让服务器提前从 CA 拉取吊销状态并跟随证书一起发给浏览器省一轮通信。配置完成后用nginx -t测试配置文件语法然后nginx -s reload优雅重载。四、HTTP 强制跳转 HTTPS用户不会主动敲https://他们只记域名。所以必须在 HTTP80 端口上做 301 永久重定向server { listen 80; server_name admin.smartkaba.com device.smartkaba.com api.smartkaba.com; return 301 https://$host$request_uri; }301是永久重定向浏览器会缓存这个跳转下次用户再敲 HTTP 浏览器自己就跳过去了。$host取的是当前请求的域名$request_uri取的是路径和参数——这样不管用户访问哪个子域名、哪个路径都能正确跳到对应的 HTTPS 地址一条指令搞定多域名跳转。五、Let’s Encrypt 自动续期——再也不怕证书过期Let’s Encrypt 证书有效期只有 90 天必须配自动续期否则证书过期用户访问就是一片红。certbot 自动续期certbot 安装时会自动创建 systemd timer但建议手动确认一下# 查看定时任务systemctl status certbot.timer# 模拟续期测试不加 --dry-run 真续certbot renew --dry-run# 续期成功后重载 Nginx# 把下面这行加到 /etc/letsencrypt/cli.ini# deploy-hook systemctl reload nginx或者更简单用 crontab 兜底# 每天凌晨 3 点检查续期成功就重载 Nginx03* * * certbot renew--quiet--deploy-hooksystemctl reload nginx小提示certbot renew 只在证书到期前 30 天内才会真正续期所以每天跑没毛病不会频繁请求 CA 服务器。对于工控屏设备4G 网络环境不稳定建议在服务器端统一续期工控屏只需要配置证书文件的 symlink 或定期同步。六、安全加固——HSTS 与 SSL 评分优化HSTSHTTP Strict Transport Security加上这个头浏览器在指定时间内只通过 HTTPS 访问你的站点即使用户手动敲 HTTP 也不会降级add_header Strict-Transport-Security max-age63072000; includeSubDomains; preload always;max-age63072000两年内强制 HTTPSincludeSubDomains所有子域名也强制preload申请加入浏览器 HSTS 预加载列表浏览器出厂内置警告includeSubDomains意味着你所有的子域名都必须支持 HTTPS有一个不支持整个域名下的访问都会挂。加之前务必确认。完整安全加固配置server { listen 443 ssl http2; server_name admin.smartkaba.com; # ... SSL 证书配置 ... # 安全头 add_header Strict-Transport-Security max-age63072000; includeSubDomains; preload always; add_header X-Frame-Options DENY always; add_header X-Content-Type-Options nosniff always; add_header X-XSS-Protection 1; modeblock always; add_header Referrer-Policy strict-origin-when-cross-origin always; # 禁用 Nginx 版本号暴露 server_tokens off; }X-Frame-Options DENY禁止网页被 iframe 嵌入防点击劫持X-Content-Type-Options nosniff禁止浏览器自动推断 MIME 类型防 MIME 混淆攻击server_tokens off隐藏 Nginx 版本号减少信息泄露配完之后可以用 SSL Labs 做评分检测目标 A。总结HTTPS 不是可选项是必选项。从 TLS 握手原理到 certbot 自动申请证书从 Nginx SSL 配置到 HTTP 强制跳转再到 HSTS 安全加固这套流程走下来你的站点评分稳稳 A。对于无人售货柜这种涉及支付的系统HTTPS 是用户信任的底线——地址栏上那把绿色小锁就是安全感的具象化。