首页 > 解决方案 > SSL 是否执行自动重新协商

问题描述

我有一个用 C++ 编写的客户端服务器应用程序,使用 SSL 1.0.1n 进行套接字通信。我试图阻止重新谈判(这是一项要求)。在我的代码中,我没有发起重新协商。我看到 openssl 有一个 BIO_set_ssl_renegotiate_bytes 和 BIO_set_ssl_renegotiate_timeout 允许您在读取一定数量的字节或超时后设置自动重新协商。我的问题是,如果我没有为其中任何一个设置值,它们是否具有默认值,SSL 仍会自动启动重新协商?如果没有在代码中完成,我无法弄清楚导致重新谈判的原因。

标签: c++sslopenssl

解决方案


我试图阻止重新谈判(这是一项要求)

希望该要求不是对CVE-2009-3555 的回应。这在 2009 年 11 月的 OpenSSL 0.9.8k 中得到了修复。TLSv1.1 和更高版本的协议从未受到该漏洞的影响。

但是,您仍然可以通过设置SSL_OP_NO_RENEGOTIATIONSSL_CTX_set_options()SSL_set_options选项:

SSL_CTX_set_options

姓名

SSL_CTX_set_options、SSL_set_options、SSL_CTX_clear_options、SSL_clear_options、SSL_CTX_get_options、SSL_get_options、SSL_get_secure_renegotiation_support - 操作 SSL 选项

概要

 #include <openssl/ssl.h>

 long SSL_CTX_set_options(SSL_CTX *ctx, long options);
 long SSL_set_options(SSL *ssl, long options);

 long SSL_CTX_clear_options(SSL_CTX *ctx, long options);
 long SSL_clear_options(SSL *ssl, long options);

 long SSL_CTX_get_options(SSL_CTX *ctx);
 long SSL_get_options(SSL *ssl);

 long SSL_get_secure_renegotiation_support(SSL *ssl);

描述

SSL_CTX_set_options() 将选项中通过位掩码设置的选项添加到 ctx。之前已经设置的选项不会被清除!

SSL_set_options() 将通过选项中的位掩码设置的选项添加到 ssl。之前已经设置的选项不会被清除!

SSL_CTX_clear_options() 清除通过 ctx 选项中的位掩码设置的选项。

SSL_clear_options() 清除通过 ssl 选项中的位掩码设置的选项。

SSL_CTX_get_options() 返回为 ctx 设置的选项。

SSL_get_options() 返回为 ssl 设置的选项。

SSL_get_secure_renegotiation_support() 指示对等方是否支持安全重新协商。请注意,这是通过宏实现的。笔记

可以通过设置几个选项来更改 SSL 库的行为。这些选项被编码为位掩码,并且可以通过按位或操作 (|) 组合。

SSL_CTX_set_options() 和 SSL_set_options() 影响 SSL 库的(外部)协议行为。API 的(内部)行为可以通过使用类似的 SSL_CTX_set_mode 和 SSL_set_mode() 函数进行更改。

在握手期间,使用 SSL 对象的选项设置。当使用 SSL_new() 从上下文创建新的 SSL 对象时,会复制当前选项设置。对 ctx 的更改不会影响已创建的 SSL 对象。SSL_clear() 不影响设置。

...

可以使用以下修改选项:

...

SSL_OP_NO_RENEGOTIATION

在 TLSv1.2 及更早版本中禁用所有重新协商。不要发送 HelloRequest 消息,并忽略通过 ClientHello 的重新协商请求。

安全的重新谈判

...

请注意,该页面有一个“SECURE RENEGOTIAION”部分。阅读。

然后,您确实需要检查您的要求。他们很有可能已经过时了十年。通过让您将时间和精力花在十年前解决的问题上,您并没有花费时间和精力来解决当前的问题。


推荐阅读