CyberSecurity:SSL Client-Initiated Renegotiation 客户端发起的重新协商ddos攻击
🔐 SSL Client-Initiated Renegotiation 漏洞分析与解决方案
🔐 SSL Client-Initiated Renegotiation Vulnerability & Solutions
📖 1. 漏洞描述 / Description
中文 服务器允许 SSL/TLS 客户端发起的重新协商 (Client-Initiated Renegotiation)。这意味着客户端在连接期间可以多次请求重新协商加密参数,从而导致潜在的安全风险。
English The server allows SSL/TLS client-initiated renegotiation. This means a connected client can request to renegotiate the encryption parameters multiple times during a single connection, which introduces potential risks.
👨💻 Author: Moshow郑锴 ⚡ Powered by: https://zhengkai.blog.csdn.net/
⚠️ 2. 漏洞影响 / Impact
中文 攻击者可能利用该特性发起 拒绝服务攻击 (DoS),通过不断发送重新协商请求消耗服务器的 CPU 和内存,导致性能下降甚至服务不可用。
English Attackers can exploit this feature to launch Denial-of-Service (DoS) attacks by repeatedly sending renegotiation requests, consuming server CPU and memory, degrading performance, or making the service unavailable.
🛠️ 3. 修复建议 / Recommendations
中文 除非业务必须,否则应禁用客户端发起的 SSL/TLS 重新协商。
确保使用最新版本的 SSL/TLS 库(如 OpenSSL、Java SSL)。
在不同服务中通过配置禁用或限制重新协商。
English Unless strictly required, disable client-initiated SSL/TLS renegotiation.
Ensure you are using an updated SSL/TLS library (e.g., OpenSSL, Java SSL).
Disable or restrict renegotiation in server-specific configurations.
🚀 4. 各服务解决方案 / Solutions by Platform
🌐 NGINX
中文
使用最新版本的 NGINX(1.25+),其默认已不支持不安全的重新协商。
确保 OpenSSL 版本 ≥ 1.1.0。
在配置中避免启用
ssl_legacy_renegotiation
。
配置示例 (nginx.conf)
nginx
ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
# 禁用不安全的重新协商
ssl_renegotiation off;
English
Use the latest NGINX version (1.25+), which by default does not support insecure renegotiation.
Ensure OpenSSL ≥ 1.1.0.
Avoid enabling
ssl_legacy_renegotiation
.
🟢Node.js (Express)
中文Node.js 默认使用 OpenSSL 库。要禁用客户端重新协商,可以通过限制 TLS 握手行为:
代码示例 (app.js)
const fs = require('fs');
const https = require('https');
const crypto = require('crypto');
const express = require('express');const app = express();const tlsOptions = {key: fs.readFileSync(process.env.TLS_KEY_PATH),cert: fs.readFileSync(process.env.TLS_CERT_PATH),// ca: fs.readFileSync(process.env.TLS_CA_PATH), // 可选honorCipherOrder: true,minVersion: 'TLSv1.2',//👨💻 Author: Moshow郑锴 ⚡ Powered by: https://zhengkai.blog.csdn.net/// 组合多个安全选项secureOptions:crypto.constants.SSL_OP_NO_RENEGOTIATION |crypto.constants.SSL_OP_NO_SSLv2 |crypto.constants.SSL_OP_NO_SSLv3 |crypto.constants.SSL_OP_NO_TLSv1 |crypto.constants.SSL_OP_NO_TLSv1_1 |crypto.constants.SSL_OP_CIPHER_SERVER_PREFERENCE
};https.createServer(tlsOptions, app).listen(8000, () => {console.log('Secure server running on port 8000');
});
EnglishNode.js relies on OpenSSL. To disable renegotiation, use SSL_OP_NO_RENEGOTIATION
in the TLS options.
🔐 常见 secureOptions
选项
选项 | 作用 | 推荐情况 |
---|---|---|
SSL_OP_NO_RENEGOTIATION | 禁用客户端发起的重新协商 | ✅ 强烈推荐 |
SSL_OP_NO_SSLv2 | 禁用 SSLv2 | ✅ 必须禁用 |
SSL_OP_NO_SSLv3 | 禁用 SSLv3 | ✅ 必须禁用(POODLE 漏洞) |
SSL_OP_NO_TLSv1 | 禁用 TLS 1.0 | ✅ 建议禁用(已过时) |
SSL_OP_NO_TLSv1_1 | 禁用 TLS 1.1 | ✅ 建议禁用(已过时) |
SSL_OP_CIPHER_SERVER_PREFERENCE | 强制使用服务端优先的加密套件顺序 | ✅ 推荐 |
SSL_OP_NO_TICKET | 禁用 TLS 会话票据(Session Tickets) | 可选(部分场景下提升安全性) |
☕ Spring Boot 3 (Java)
中文 Spring Boot 使用 Java SSL/TLS。可以通过 JVM 参数或配置禁用重新协商:
application.properties
properties
server.port=8010
server.ssl.enabled-protocols=TLSv1.2,TLSv1.3
server.ssl.ciphers=TLS_AES_256_GCM_SHA384,TLS_CHACHA20_POLY1305_SHA256
JVM 启动参数(临时)
-Djdk.tls.rejectClientInitiatedRenegotiation=true
English Spring Boot uses Java SSL/TLS. Disable renegotiation via JVM options:
Add
-Djdk.tls.rejectClientInitiatedRenegotiation=true
Restrict protocols and ciphers in
application.properties
.
🔐 详细说明server.ssl.enabled-protocol/sciphers
1. server.ssl.enabled-protocols
可选项
这个配置用于指定 允许的 TLS 协议版本。
TLSv1 → 已过时,不安全(不推荐)
TLSv1.1 → 已过时,不安全(不推荐)
TLSv1.2 → 目前仍广泛使用,安全性良好 ✅
TLSv1.3 → 最新标准,性能更好,安全性更强 ✅
👉 推荐配置:
properties
server.ssl.enabled-protocols=TLSv1.2,TLSv1.3
只启用 TLS 1.2 和 1.3,禁用旧版本。
2. server.ssl.ciphers
可选项
这个配置用于指定 允许的加密套件 (Cipher Suites)。 Cipher Suite 由 密钥交换算法 + 加密算法 + 摘要算法 组成。
常见安全 Cipher Suites(推荐)
TLS 1.3 专用套件(无需手动配置时,JDK 默认启用)
TLS_AES_256_GCM_SHA384
TLS_AES_128_GCM_SHA256
TLS_CHACHA20_POLY1305_SHA256
TLS 1.2 强加密套件
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256
不推荐(弱加密/过时)
TLS_RSA_*
(纯 RSA 握手,缺少前向保密)TLS_ECDHE_*_WITH_AES_128_CBC_SHA
(CBC 模式易受攻击)TLS_DHE_*
(性能差,兼容性差)
3. 示例配置(推荐安全组合)
properties
server.ssl.enabled-protocols=TLSv1.2,TLSv1.3
server.ssl.ciphers=TLS_AES_256_GCM_SHA384,\TLS_AES_128_GCM_SHA256,\TLS_CHACHA20_POLY1305_SHA256,\TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,\TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,\TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256
✅ 总结:
协议:只保留 TLSv1.2 和 TLSv1.3。
Cipher:优先 AES-GCM 和 CHACHA20-POLY1305,避免 CBC 和 RSA-only。
🎯 5. 总结 / Conclusion
中文 SSL 客户端发起的重新协商功能在现代应用中几乎没有必要,且存在严重的 DoS 风险。通过在 NGINX、Node.js Express、Spring Boot 3 中禁用该特性,可以有效提升服务的安全性与稳定性。
English Client-initiated SSL renegotiation is rarely needed in modern applications and poses a significant DoS risk. Disabling it in NGINX,Node.js Express, and Spring Boot 3 strengthens both security and stability.
👨💻 Author: Moshow郑锴 ⚡ Powered by: https://zhengkai.blog.csdn.net/