每次看到浏览器地址栏里那个绿色小锁图标,心里就踏实不少。不过要让这个小锁稳稳地亮起,背后的Nginx配置可藏着不少门道。作为承载全球近三分之一网站流量的服务器软件,Nginx的HTTPS配置质量直接关系到数亿用户的访问安全。
去年某大型电商平台的证书泄露事件还历历在目,就因为私钥文件权限设置不当。正确的证书文件权限应该是600,即只有root用户可读写。将证书文件存放在/etc/nginx/ssl/目录已成为行业惯例,这个路径既保证了安全性,又便于维护。
私钥加密与否是个容易被忽略的细节。如果私钥在生成时设置了密码,Nginx每次重启都需要手动输入,这在自动化部署中会带来麻烦。建议在部署前使用openssl rsa命令进行解密,但务必确保解密后的文件权限设置正确。
TLS 1.0和1.1早在2018年就被主要浏览器标记为不安全,现在连TLS 1.2都在逐步淘汰中。最新的最佳实践是仅启用TLS 1.2和1.3:
ssl_protocols TLSv1.2 TLSv1.3;
加密套件的选择更考验技术功底。那些基于RC4、DES的弱密码必须坚决禁用。推荐使用现代加密套件组合:
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
光是配置HTTPS还不够,要防止降级攻击就得启用HSTS。这个响应头告诉浏览器在指定期限内只能通过HTTPS访问该站点:
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
不过要特别注意,一旦启用HSTS,在max-age有效期内都无法撤销,所以在测试阶段要谨慎使用较短的过期时间。
性能优化:安全与速度的平衡术
HTTPS带来的性能损耗主要来自TLS握手。通过优化ssl_session_timeout和ssl_session_cache可以显著降低这种开销:
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
启用HTTP/2是另一个性能提升的关键。相比HTTP/1.1,HTTP/2的多路复用特性能够大幅提升页面加载速度,而且现代浏览器都要求HTTPS才能使用HTTP/2。
配置验证:避免灾难的最后检查
在重启Nginx前,务必要执行nginx -t测试配置语法。这个简单的步骤能避免因配置错误导致的服务中断。有一次我们在凌晨部署时跳过了这一步,结果整个服务宕机了半小时。
证书链的完整性验证同样重要。使用openssl verify命令可以检查证书链是否正确,避免出现浏览器提示"证书不受信任"的尴尬情况。
配置完成后,通过SSL Labs的SSL Server Test进行全方位扫描,这个工具能给出具体的改进建议,连很多资深运维都把它作为标准验收流程。
参与讨论
锁图标亮了,安全感满满👍
别忘了把 ssl_session_cache 调大点,能省不少握手时间。
这套配置确实靠谱,照搬就行。
配置检查真是救命稻草。
HSTS 的 max-age 要设多长合适?
说TLS1.0还能用其实不对,主流浏览器早已把它踢出兼容名单,继续保留只会给安全留下隐患。
我前几天把私钥权限改成600,结果部署后再也没出现证书异常,省了不少心。
别老把 HTTPS 当装饰,配置不当比没装还糟。
听说某大厂昨晚因为 HSTS 失误导致全站 HTTPS 失效,真是血的教训。
还有人把证书链写错,结果浏览器直接报不受信任,连测试环境都被逼上线前卡住。