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字节)

攻击者可以:

  1. 强制降级到 SSL 3.0
  2. 通过修改密文块观察服务器响应
  3. 逐字节解密敏感信息(如 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

迁移清单

  • 服务器配置禁用 SSLv2、SSLv3
  • 禁用 TLSv1.0、TLSv1.1(PCI DSS 要求)
  • 启用 TLSv1.2 和 TLSv1.3
  • 移除弱加密套件(RC4、DES、3DES)
  • 测试所有客户端兼容性
  • 监控服务器日志,确认无 SSL 连接尝试

参考来源