嗨,我想在客户端使用 SSLV23 方法支持多个版本的 TLS。但是我无法连接收到错误:
SSL23_GET_SERVER_HELLO:SSLV3 警报握手失败
任何人都可以告诉我如何使用openssl支持多个版本的TLS?
SSLV23 的代码片段(不起作用)
cctx = SSL_CTX_new(SSLv23_client_method());
if(cctx) {
SSL_CTX_set_options(cctx, SSL_OP_NO_SSLv3);
}
仅适用于 TLS v1(工作)
cctx = SSL_CTX_new(TLSv1_client_method());
根据您的标签和评论,我假设您只需要 TLS 连接。客户端应仅启动 TLS 连接。如果是这样,你为什么坚持SSLv23_client_method
?但是在我的测试中,以下内容确实发出了TLS 1.0客户端问候:
ctx = SSL_CTX_new(SSLv23_client_method());
SSL_CTX_set_options(ctx,SSL_OP_NO_SSLv3);
为了防止POODLE攻击,最好是在客户端和服务器上完全禁用SSL3支持。在您的情况下,您提到服务器仅支持 TLS。因此,不需要在 SSL3 上向后兼容客户端如果服务器确实通信SSL3,为了防止POODLE攻击,客户端和服务器应实现TLS回退信令密码套件值 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);
您也可以或选项并一次性传递给SSL_CTX_set_options
。