阳子
阳子
Published on 2024-12-05 / 6 Visits
0
0

不安全的传输协议TLS

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-ciphersssl-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

79D8DD41-06FD-4603-8C44-FCE222E02D8A.png

解决 TLS 1.0 问题 | Microsoft Learn

IIS设置协议版本需要用到IIS Crypto第三方工具,使用第三方工具设置后需要重新启动服务器,IIS Crypto最低是要要求是Windows Server 2008 and the .Net 4.0 framework。

34A23067-79B3-4CCD-AA8C-E2A16D89E8FA.png

下载连接: Nartac Software - Download

下载选择GUI桌面可视化版本,不要选择第二个,第二个是命令行版本的。

9B8A0AFC-D31E-432D-B521-0113DF12B66B.png

选择对应协议版本设置,服务端和客户端都要同步设置,不然协议版本无法生效。设置完毕后重启服务器即可, 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负载均衡

1A270FDA-6FF8-4C4C-BA15-702E01BE034F.png

③CDN 内容分发

76C1B974-D4BA-4FBE-8154-001CFF9F76D4.png

验证配置

配置完成后,可以使用工具如 openssl 或在线工具(如 Qualys SSL Labs 的 SSL Test)来验证 TLS 版本是否已正确禁用:

openssl s_client -connect example.com:443 -tls1_1

如果连接失败,说明 TLS 1.1 已成功禁用。

在线工具:

https://myssl.com/


Comment