我如何在客户端支持多个版本的TLS?

时间:2015-04-21 17:44:46

标签: c++ ssl openssl ssl-certificate poodle-attack

您好我想在客户端使用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());

1 个答案:

答案 0 :(得分:7)

根据你的标签和评论,我假设你只想要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://tools.ietf.org/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