ssleay32.dll 不导出 TLS_method

ssleay32.dll does not export TLS_method

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

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

我已阅读 https://www.openssl.org/docs/ssl/SSL_CTX_new.html 中提供的文档,其中说 TLS_methodTLS_client_methodTLS_server_method 方法可以做到这一点。

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

我应该使用什么方法来自动进行版本协商?还是我应该在运行时选择版本?

I would like to configure my application to automatic negotiate the highest version possible.

使用来自 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 and above"。

注意下界确实提供了TLS 1.0的TLS记录层版本。上限是 TLS 1.2 的 TLS 客户端版本。记录层携带加密的有效载荷。 SSLv23_method 为您提供特定格式的 ClientHello(对于 SSLv3 及更高版本)。

暗示记录层版本的下限是大多数人使用它的方式,而不是标准的编写方式。而 TLS 工作组似乎拒绝以这种方式提供。给出的有效参数是 "suppose a client want to use TLS 1.0, 1.2 and 1.3, but not 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