TLS 简介
SSL(Secure Socket Layer) / TLS(Transport Layer Security) 是独立于 HTTP 的协议,所以不光是 HTTP 协议,其他运行在应用层的 SMTP 和 Telnet 等协议均可配合 SSL / TLS 协议使用,可以说 SSL / TLS 是当今世界上应用最为广泛的网络安全技术。
Netscape 开发了原始的 SSL 协议:
SSL 1.0 因为存在严重的安全缺陷从未公开发布
SSL 2.0于 1995年发布,但其中仍包含许多安全缺陷
SSL 3.0在1996年发布了。随着加密与解密安全攻防战的博弈,SSL 协议的安全性逐渐满足不了需求
SSL 2.0 在 2011 年被RFC 6176弃用
SSL 3.0 于 2015 年被RFC 7568弃用。
TLS的发展历程:
TLS 1.0 在 1999 年发布于RFC 2246中,TLS 1.0 和 SSL 3.0 之间的差异并不显著(TLS 1.0 等同于 SSL 3.1),改名主要是为了和Netscape撇清关系(TLS协议由 IETF 进行标准化)
TLS 1.1 于 2006 年在RFC 4346中定义
TLS 1.2 于 2008 年在RFC 5246中定义,并于2011年在RFC 6176中完成优化
TLS 1.3 于 2018 年在RFC 8446中定义。
早在2018年10月,苹果、谷歌、微软和Mozilla就联合宣布,将在2020年3月弃用TLS 1.0和TLS 1.1(当你读到本篇博客时,TLS 1.0和TLS 1.1 已经被弃用)
TLS 1.3 才发布没多久,未来几年内 TLS 1.2 将成为网络安全协议的主流(HTTP/2协议便使用TLS 1.2+版本作为安全加密层)。
TLS 1.0 TLS 1.1开启的危害
1. 已知漏洞
BEAST (Browser Exploit Against SSL/TLS):这是一个针对 TLS 1.0 的攻击,利用了 CBC 模式中的块密码加密方式的漏洞。
POODLE (Padding Oracle On Downgraded Legacy Encryption):这个攻击利用了 SSL 3.0 中的填充 oracle 漏洞,但也可以通过降级攻击影响 TLS 1.0。
CRIME (Compression Ratio Info-leak Made Easy) 和 BREACH (Browser Reconnaissance and Exfiltration via Adaptive Compression of Hypertext):这些攻击利用了压缩算法的漏洞,虽然主要影响 SSL 3.0,但也可能影响 TLS 1.0 和 1.1。
2. 弱加密算法
RC4:RC4 是一种流密码,已被证明存在多个安全问题,不再被认为是安全的。
MD5 和 SHA-1:这些哈希函数已经被证明存在碰撞攻击的风险,不再适合用于生成数字签名。
3. 协议设计缺陷
不支持前向安全性:TLS 1.0 和 1.1 不支持前向安全性(Forward Secrecy),这意味着如果私钥被泄露,所有之前的会话都可以被解密。
缺乏对现代加密算法的支持:TLS 1.0 和 1.1 不支持现代的加密算法,如 ChaCha20-Poly1305,这限制了安全性和性能。
4. 合规性问题
PCI DSS:支付卡行业数据安全标准(PCI DSS)要求禁用 TLS 1.0 和 1.1,以确保支付系统的安全性。
其他行业标准:许多其他行业标准和最佳实践也建议禁用这些旧版本的 TLS 协议。
5. 性能问题
握手延迟:TLS 1.0 和 1.1 的握手过程相对较慢,影响了连接的建立速度。
资源消耗:使用旧版本的 TLS 协议可能会导致更高的 CPU 和内存消耗,尤其是在高负载环境下。
6. 未来兼容性
浏览器和客户端支持:现代浏览器和客户端已经逐渐停止对 TLS 1.0 和 1.1 的支持,继续使用这些协议可能导致兼容性问题。
安全性更新:随着新的安全威胁不断出现,继续使用旧版本的 TLS 协议将无法获得最新的安全更新和补丁。
禁用TLS方法
1. Nginx
编辑 Nginx 配置文件(通常位于 /etc/nginx/nginx.conf
或 /etc/nginx/conf.d/
目录下),找到或添加 ssl_protocols
指令:
server {
listen 443 ssl;
server_name example.com;
ssl_certificate /path/to/certificate.pem;
ssl_certificate_key /path/to/certificate.key;
# 禁用 TLS 1.0 和 TLS 1.1
ssl_protocols TLSv1.2 TLSv1.3;
}
保存文件后,重新加载 Nginx 配置:
sudo systemctl reload nginx
2. Apache
编辑 Apache 配置文件(通常位于 /etc/apache2/sites-available/
目录下),找到或添加 SSLProtocol
指令:
<VirtualHost *:443>
ServerName example.com
SSLEngine on
SSLCertificateFile /path/to/certificate.pem
SSLCertificateKeyFile /path/to/certificate.key
# 禁用 TLS 1.0 和 TLS 1.1
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
</VirtualHost>
Apache 配置:
sudo systemctl reload apache2
3. HAProxy
编辑 HAProxy 配置文件(通常位于 /etc/haproxy/haproxy.cfg
),找到或添加 ssl-default-bind-ciphers
和 ssl-default-bind-options
指令:
1frontend https_in
bind *:443 ssl crt /path/to/certificate.pem
# 禁用 TLS 1.0 和 TLS 1.1
ssl-default-bind-options no-tls-tickets
ssl-default-bind-ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:AES:CAMELLIA:DES-CBC3-SHA:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA
ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11
保存文件后,重新启动 HAProxy:
sudo systemctl restart haproxy
4. OpenSSL
如果你的应用程序直接使用 OpenSSL,可以通过设置环境变量或在代码中指定支持的 TLS 版本。例如,在命令行中使用 OpenSSL 时:
openssl s_server -accept 443 -cert /path/to/certificate.pem -key /path/to/certificate.key -no_tls1 -no_tls1_1
5. Windows IIS
解决 TLS 1.0 问题 | Microsoft Learn
IIS设置协议版本需要用到IIS Crypto第三方工具,使用第三方工具设置后需要重新启动服务器,IIS Crypto最低是要要求是Windows Server 2008 and the .Net 4.0 framework。
下载连接: Nartac Software - Download
下载选择GUI桌面可视化版本,不要选择第二个,第二个是命令行版本的。
选择对应协议版本设置,服务端和客户端都要同步设置,不然协议版本无法生效。设置完毕后重启服务器即可, IIS Crypto目前是不支持TLSv1.3。
6. Node.js
在 Node.js 应用程序中,可以通过 https.createServer
方法指定支持的 TLS 版本:
const https = require('https');
const fs = require('fs');
const options = {
key: fs.readFileSync('/path/to/certificate.key'),
cert: fs.readFileSync('/path/to/certificate.pem'),
minVersion: 'TLSv1.2'
};
https.createServer(options, (req, res) => {
res.writeHead(200);
res.end('Hello World\n');
}).listen(443);
7. 阿里云
阿里云存在多处可调整版本:
①ESA边缘安全
②SLA负载均衡
③CDN 内容分发
验证配置
配置完成后,可以使用工具如 openssl
或在线工具(如 Qualys SSL Labs 的 SSL Test)来验证 TLS 版本是否已正确禁用:
openssl s_client -connect example.com:443 -tls1_1
如果连接失败,说明 TLS 1.1 已成功禁用。
在线工具:
https://myssl.com/