ssleay32.dll不导出TLS_方法

ssleay32.dll不导出TLS_方法,ssl,openssl,Ssl,Openssl,我正在将应用程序中的OpenSSL库更新为1.0.2c版 此版本支持TLS 1.0、TLS 1.1和TLS 1.2以及SSL 3.0。我想将我的应用程序配置为自动协商可能的最高版本 我已经阅读了提供的文档,其中说明TLS\u方法,TLS\u客户端方法和TLS\u服务器方法方法可以做到这一点 但是在Windows发行版中(在中可用),ssleay32.dll不导出方法TLS\u方法,TLS\u客户端方法和TLS\u服务器方法。其他方法,如TLSv1\u方法,TLSv1\u方法和TLSv1\u方法。

我正在将应用程序中的OpenSSL库更新为1.0.2c版

此版本支持TLS 1.0、TLS 1.1和TLS 1.2以及SSL 3.0。我想将我的应用程序配置为自动协商可能的最高版本

我已经阅读了提供的文档,其中说明
TLS\u方法
TLS\u客户端方法
TLS\u服务器方法
方法可以做到这一点

但是在Windows发行版中(在中可用),
ssleay32.dll
不导出方法
TLS\u方法
TLS\u客户端方法
TLS\u服务器方法
。其他方法,如
TLSv1\u方法
TLSv1\u方法
TLSv1\u方法
。但是,它们只接受特定的版本

我应该使用什么方法使版本协商自动化?或者我应该在运行时选择版本

我想将我的应用程序配置为自动协商可能的最高版本

使用OpenSSL wiki上的以下代码:

const SSL_METHOD* method = SSLv23_method();
if(method == NULL) handleFailure();

ctx = SSL_CTX_new(method);
if(ctx == NULL) handleFailure();

/* Cannot fail ??? */
const long flags = SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_COMPRESSION;
SSL_CTX_set_options(ctx, flags);
它使您获得“TLS 1.0及更高版本”

注意,下限实际上提供了TLS 1.0的TLS记录层版本。上限是TLS 1.2的TLS客户端版本。记录层承载加密的有效载荷。而
SSLv23_方法
将以特定格式(对于SSLv3及更高版本)为您提供一个
ClientHello

暗示记录层版本的下限是大多数人使用它的方式,而不是标准的编写方式。TLS工作组似乎拒绝这样做。给出的有效论点是“假设客户希望使用TLS 1.0、1.2和1.3,而不是1.1”。我不知道有谁会放弃这样的协议版本,所以对我来说这只是一个救命稻草

你可以在答案中的一个阅读更多关于它的内容


与此相关,您应该使用此密码套件列表:

const char* const PREFERRED_CIPHERS = "HIGH:!aNULL:!MD5:!RC4";
res = SSL_set_cipher_list(ssl, PREFERRED_CIPHERS);
if(res != 1) handleFailure();
事实上,RSA密钥传输不再受到安全社区的青睐,因此在使用带有RSA密钥的证书时,以下可能是更好的选择:

"HIGH:!aNULL:!MD5:!RC4:!kRSA";

密码字符串将提供大部分当代安全性,并将避免在Windows发行版中出现。

ssleay32.dll
不会导出
SSL\u CTX\u set\u选项
。我在导出部分找不到该函数。还有其他功能可以设置选项吗?@Stephan-这是一个宏。我已经看过你写的bug报告了。我选中了
ssl.h
源代码,我将尝试使用
ssl\u CTX\u ctrl
函数发送上述选项。在删除值为
的调用
ssl\u CTX\u set\u cipher\u list
后,此解决方案对我有效!ADH:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP'
。现在,我可以使用
ssl3.0
tls1
tls1.1
tls1.2
@StephanDieterBieging-
+SSLv2
连接到服务器,密码列表中不应显示。您可以使用和朋友通过
SSL\u OP.*
选项添加或删除该选项。有关选项和设置上下文的信息,请参见。对于密码列表,请使用
“HIGH:!ADH:!RC4:!MD5”
。您使用的是什么版本的OpenSSL?我使用的是OpenSSL 1.0.2c。OpenSSL 1.1.0中添加了
TLS|u(客户端|服务器)_method()
函数。对于1.0.2及更早版本,您必须使用较旧的
..\u方法()
函数(
TLSv1(客户端|服务器)\u方法()
TLSv1(客户端|服务器)\u方法()
TLSv1\u 2(客户端|服务器)\u方法()
,等等)。对于版本协商,您可以使用
SSLv23(客户端|服务器)\u方法()