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_SHA256JVM 启动参数(临时)
-Djdk.tls.rejectClientInitiatedRenegotiation=trueEnglish 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/
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号