根据您的标签和评论,我认为您只想要TLS连接。客户端应该只发起TLS连接。如果是这样,为什么您还坚持使用SSLv23_client_method
呢?但在我的测试中,以下内容确实发送了TLS 1.0客户端hello:
ctx = SSL_CTX_new(SSLv23_client_method());
SSL_CTX_set_options(ctx,SSL_OP_NO_SSLv3);
为了防止POODLE攻击,最好的方法是在客户端和服务器上完全禁用SSL3支持。在您的情况下,您提到服务器仅支持TLS。因此,无需与SSL3上的客户端进行向后兼容。
如果服务器确实使用SSL3通信,则为了防止POODLE攻击,客户端和服务器应该实现TLS回退信令Cipher Suite Value-
https://datatracker.ietf.org/doc/html/draft-ietf-tls-downgrade-scsv-05
以下是客户端设置TLS的示例:
/* Exclude SSLv2 and SSLv3 */
ctx = SSL_CTX_new(TLSv1_client_method());
SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2);
SSL_CTX_set_options(ctx,SSL_OP_NO_SSLv3);
/* Exclude SSLv2, SSLv3 and TLS 1.0 */
ctx = SSL_CTX_new(TLSv1_1_client_method());
SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2);
SSL_CTX_set_options(ctx,SSL_OP_NO_SSLv3);
SSL_CTX_set_options(ctx,SSL_OP_NO_TLSv1);
/* Exclude SSLv2, SSLv3 ,TLS 1.0 and TLS 1.1 */
ctx = SSL_CTX_new(TLSv1_2_client_method());
SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2);
SSL_CTX_set_options(ctx,SSL_OP_NO_SSLv3);
SSL_CTX_set_options(ctx,SSL_OP_NO_TLSv1);
SSL_CTX_set_options(ctx,SSL_OP_NO_TLSv1_1);
您可以将选项进行OR运算,并一次性传递给SSL_CTX_set_options
。
TLSv1_client_method()
呢?顺便说一下,你展示的代码在我的测试中确实导致了 TLS1.0 连接。 - PrabhuSSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3
作为上下文选项。您应该使用SSL_OP_NO_COMPRESSION
禁用压缩。由于您正在使用TLS 1.0及以上版本,因此还应设置SNI的服务器名称。另请参见OpenSSL维基上的SSL/TLS客户端。 - jww