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-GCMCHACHA20-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/

posted @ 2025-10-30 10:32  gccbuaa  阅读(3)  评论(0)    收藏  举报