SSL(Secure Sockets Layer)协议曾是最广泛使用的加密协议,但如今已被彻底弃用。本文聚焦分析 SSL 协议的安全缺陷,解释为何必须迁移到 TLS。
SSL 的三个版本#
| 版本 |
发布年份 |
状态 |
| SSL 1.0 |
未发布 |
存在严重缺陷,从未公开 |
| SSL 2.0 |
1995 |
2011年正式弃用 (RFC 6176) |
| SSL 3.0 |
1996 |
2015年正式弃用 (RFC 7568) |
致命漏洞:POODLE 攻击#
2014年发现的 POODLE(Padding Oracle On Downgraded Legacy Encryption)攻击是 SSL 3.0 的"死刑判决"。
漏洞原理#
SSL 3.0 的 CBC 模式填充验证存在缺陷:
1
2
3
|
明文块: D1 D2 D3 D4 D5 D6 D7 D8
填充后: D1 D2 D3 D4 D5 D6 D7 01 (填充1字节)
或: D1 D2 D3 D4 D5 D6 02 02 (填充2字节)
|
攻击者可以:
- 强制降级到 SSL 3.0
- 通过修改密文块观察服务器响应
- 逐字节解密敏感信息(如 Cookie)
验证服务器是否支持 SSL 3.0#
1
2
3
4
5
|
# 使用 openssl 测试 SSL 3.0 支持
openssl s_client -connect example.com:443 -ssl3
# 如果返回 handshake failure,说明已禁用
# 如果建立连接,说明存在风险
|
其他关键漏洞#
DROWN 攻击(2016)#
利用 SSL 2.0 漏洞攻击支持 SSL 2.0 的服务器:
1
2
3
4
|
# 检查是否支持 SSL 2.0
openssl s_client -connect example.com:443 -ssl2
# 应返回错误:handshake failure
|
BEAST 攻击(2011)#
针对 SSL 3.0 和 TLS 1.0 的 CBC 模式漏洞:
1
2
3
4
|
攻击条件:
- 使用 CBC 模式加密套件
- 客户端使用 Java Applet 或 JavaScript
- 攻击者可预测 IV(初始化向量)
|
正确的配置#
Nginx 禁用 SSL#
1
2
3
4
5
6
7
8
9
10
11
|
server {
listen 443 ssl;
server_name example.com;
# 只启用 TLS 1.2 和 1.3
ssl_protocols TLSv1.2 TLSv1.3;
# 现代加密套件
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
}
|
Apache 禁用 SSL#
1
2
3
4
5
6
7
8
9
|
<VirtualHost *:443>
ServerName example.com
# 禁用 SSL,启用 TLS
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
# 现代加密套件
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
</VirtualHost>
|
验证配置#
1
2
3
4
5
6
7
|
# 使用 testssl.sh 检查
git clone https://github.com/drwetter/testssl.sh.git
cd testssl.sh
./testssl.sh --protocols example.com
# 或使用 nmap
nmap --script ssl-enum-ciphers -p 443 example.com
|
迁移清单#
参考来源#