去年有个客户反馈,用Chrome打开自家后台管理系统时地址栏弹出了红色警告:“您的连接不是私密连接“。技术团队排查了半天,证书没过期、域名也对得上,最后发现问题出在服务器还开着TLS 1.0。
TLS 1.0和1.1到底差在哪
TLS 1.0发布于1999年,距今已超过二十年。它的加密套件支持BEAST、POODLE等已知攻击,在实际利用中可以通过降级攻击破解会话密钥。1.1虽然修补了部分漏洞,但同样无法抵抗现代攻击手段。
2020年,IETF正式发布RFC 8996,宣布弃用TLS 1.0和1.1。随后主流浏览器(Chrome、Firefox、Edge、Safari)相继停止支持这两个版本。如果你的服务器只接受TLS 1.0连接,用户浏览器要么弹警告,要么直接拒绝访问。
更现实的影响是:各大PCI-DSS审计和等保测评标准已经把“禁用TLS 1.0/1.1“作为硬性指标。SSL Labs的评级也会因为协议版本过旧直接降到C或更低。
怎么确认当前服务器在跑哪个版本
方法一,用OpenSSL手动测:
openssl s_client -connect 你的域名:443 -tls1
如果握手成功,说明服务器还接受TLS 1.0连接,需要关闭。把-tls1换成-tls1_1再测一次。
方法二,直接上SSL Labs做完整扫描,结果里“Protocols“一栏会列出所有启用的版本。
关闭旧协议的具体操作
Nginx配置文件中,找到SSL相关段落,把ssl_protocols改成:
ssl_protocols TLSv1.2 TLSv1.3;
同时检查加密套件,推荐配置:ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
Apache用户在httpd-ssl.conf里修改SSLProtocol all -SSLv3 -TLSv1 -TLSv1_1,效果一样。
改完之后别忘了重启服务并用openssl s_client验证一遍,确认TLS 1.0握手被拒绝。
有些老旧系统(比如某些银行的对接接口)可能还在要求TLS 1.0。碰到这种情况,建议把老旧接口单独隔离到一台服务器上,主站全面升级到TLS 1.2以上。协议升级这件事,拖得越久暴露面越大。