ssleay32.dll不导出TLS_method

时间:2015-06-17 14:09:46

标签: ssl openssl

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

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

我已阅读Data Storage Options documentation中提供的文档,其中说明TLS_methodTLS_client_methodTLS_server_method方法可以执行此操作。

但是在Windows发行版中(https://www.openssl.org/docs/ssl/SSL_CTX_new.html中可用)ssleay32.dll不导出方法TLS_methodTLS_client_methodTLS_server_method。其他方法(例如TLSv1_methodTLSv1_1_methodTLSv1_2_method也会导出。但是那些只接受特定版本。

为了使版本协商自动化,我应该使用哪种方法?或者我应该在运行时选择版本吗?

1 个答案:

答案 0 :(得分:0)

  

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

在OpenSSL wiki上使用SSL/TLS Client中的以下代码:

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_method以特定格式(SSLv3及更高版本)为您提供ClientHello

隐含记录层版本的下限是大多数人使用它的方式,但不是标准的编写方式。 TLS工作组似乎拒绝以这种方式提供。给出的有效论据是“假设客户想要使用TLS 1.0,1.2和1.3,而不是1.1”。我不知道有谁丢掉这样的协议版本,所以它对我来说只是一个稻草人。

您可以通过Check Server security protocol using openssl的答案之一了解更多信息。

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

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";

密码字符串主要提供当代安全性,它将避免使用obsolete cryptography warning