说到Nginx的HTTPS证书配置,这可真是个技术活,稍有不慎就可能掉坑里。最近帮朋友调试一个电商网站,就因为证书配置问题导致支付页面出现安全警告,差点损失好几单生意。其实正确的HTTPS配置不仅仅是技术问题,更关乎用户体验和业务安全。今天咱们就来好好聊聊这个话题,分享一下我在实际工作中总结的经验。
证书选择与准备
首先得说说证书的选择。免费的Let’s Encrypt固然好用,但商业证书在某些场景下还是更靠谱。特别是金融、电商这类对安全性要求高的场景,我一般会推荐DigiCert或GeoTrust的OV/EV证书。记得有次用了某不知名CA的证书,结果被部分浏览器标记为不受信任,那叫一个尴尬。申请证书时一定要确保CSR信息准确无误,特别是Common Name和SANs扩展,这点太容易出错了。
Nginx配置核心参数
配置Nginx时,这几个参数必须重点关注:
ssl_certificate
和ssl_certificate_key
路径要对,这个不用多说。但很多人会忽略ssl_trusted_certificate
,它用来指定证书链文件,对于某些严格的校验场景特别重要。我建议把服务器证书、中间证书和根证书按顺序合并成一个文件,这样能避免很多莫名其妙的校验问题。
ssl_certificate /etc/nginx/ssl/fullchain.pem;
ssl_certificate_key /etc/nginx/ssl/private.key;
ssl_trusted_certificate /etc/nginx/ssl/ca-bundle.pem;
安全强化配置
光有证书还不够,安全协议和加密套件的配置同样关键。现在的TLS 1.3已经相当成熟了,建议优先启用。加密套件方面,ECDHE系列是首选,禁用那些已知不安全的算法。有次做渗透测试,就因为用了弱加密套件被扣了分,真是血泪教训啊!
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384';
常见问题排查
配置完成后,强烈建议用nginx -t
测试配置,然后用openssl命令验证证书链:openssl s_client -connect yourdomain.com:443 -servername yourdomain.com -showcerts
。如果看到”verify error”,那多半是证书链问题。还有个常见的坑是证书和私钥不匹配,可以用openssl x509 -noout -modulus -in cert.pem | openssl md5
和openssl rsa -noout -modulus -in key.pem | openssl md5
来比对。
对了,配置HSTS也是个好习惯,能防止SSL剥离攻击。但切记要谨慎设置max-age
,一旦设置错误想要撤销可不容易。我见过有人设置成一年后想改配置,结果导致网站不可访问,最后只能等缓存过期。
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
评论