OpenSSL问题不支持安全重新协商

时间:2014-06-09 16:41:29

标签: openssl

我需要从RedHat Linux服务器连接到Microsoft Dynamics CRM服务器。地址是xxx.api.crm4.dynamics.com。服务器接受TLSv1但不接受1.1或1.2,并且不提供重新协商。为了使我的RedHat服务器保持最新的补丁,特别是在Heartbleed附近,我需要升级到更新版本的OpenSSL。但是,这会在RedHat服务器上启用TLSv1.2。

有没有办法将OpenSSL配置为在出站通信中不使用TLSv1.2和TLSv1.1?

1 个答案:

答案 0 :(得分:2)

  

有没有办法将OpenSSL配置为在出站通信中不使用TLSv1.2和TLSv1.1?

协议版本是针对入站和出站协商的。它是ClientHello的一部分。虽然服务器可以使用比客户广告更少的协议版本,但您无法混合和匹配。

OpenSSL允许您定义OPENSSL_NO_TLS1,但我相信会杀死所有TLS,而不仅仅是TLS 1.1和TLS 1.2。

默认情况下,某些Linux发行版在客户端上禁用TLS 1.2。例如,Ubuntu为12和13执行此操作。他们通过OpenSSL OPENSSL_NO_TLS1_2_CLIENT执行此操作:

$ /usr/bin/openssl version -a
OpenSSL 1.0.1 14 Mar 2012
built on: Mon Jun  2 19:37:18 UTC 2014
platform: debian-amd64
options:  bn(64,64) rc4(16x,int) des(idx,cisc,16,int) blowfish(idx) 
compiler: cc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN
   -DHAVE_DLFCN_H -m64 -DL_ENDIAN -DTERMIO -g -O2 -fstack-protector --param=ssp-buffer-size=4
   -Wformat -Wformat-security -Werror=format-security -D_FORTIFY_SOURCE=2
   -Wl,-Bsymbolic-functions -Wl,-z,relro -Wa,--noexecstack -Wall -DOPENSSL_NO_TLS1_2_CLIENT
   -DOPENSSL_MAX_TLS1_2_CIPHER_LENGTH=50 -DMD32_REG_T=int -DOPENSSL_IA32_SSE2
   -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM
   -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM
   -DGHASH_ASM
OPENSSLDIR: "/usr/lib/ssl"

  

OpenSSL问题不支持安全重新协商

这是您的问题标题,也是一个单独的问题。你的问题是什么?


编辑(来自评论):

  

我从RedHat服务器进行连接,我们已经为Heartbleed修补了SSL,因此尝试使用TLSv1.2来启动任何握手。因此,接收服务器没有响应。

我认为这与安全的重新谈判有关(但我可能是错的)。

以下是如何以编程方式执行此操作。您不再需要再编译OpenSSL。但是你需要再次编译你的程序。

以下是method的注意事项(请注意使用TLSv1_method()):

/* https://www.openssl.org/docs/ssl/SSL_CTX_new.html */
const SSL_METHOD* method = TLSv1_method();
ASSERT(NULL != method);

/* http://www.openssl.org/docs/ssl/ctx_new.html */
ctx = SSL_CTX_new(method);
ASSERT(NULL != ctx);
...

或者,您可以使用标志:

/* https://www.openssl.org/docs/ssl/SSL_CTX_new.html */
const SSL_METHOD* method = SSLv23_method();
ASSERT(NULL != method);

/* http://www.openssl.org/docs/ssl/ctx_new.html */
ctx = SSL_CTX_new(method);
ASSERT(ctx != NULL);

/* https://www.openssl.org/docs/ssl/ctx_set_verify.html */
SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, verify_callback);
/* Cannot fail ??? */

/* Remove the most egregious. Because SSLv2 and SSLv3 have been      */
/* removed, a TLSv1.0 handshake is used. The client accepts TLSv1.0  */
/* and above. An added benefit of TLS 1.0 and above are TLS          */
/* extensions like Server Name Indicatior (SNI).                     */
long flags = SSL_OP_ALL | SSL_OP_NO_SSLv2 | SSL_OP_NO_SSLv3 | SSL_OP_NO_COMPRESSION;
     flags |= SSL_OP_NO_TLSv1_1 | SSL_OP_NO_TLSv1_2;

long old_opts = SSL_CTX_set_options(ctx, flags);
UNUSED(old_opts);
...

我更喜欢flags方法,所以我可以禁用破坏的协议(如SSLv2)和破坏的功能(如压缩)。 flags方法还允许我指定" TLS 1.0及以上" (即SSLv23_method()SSL_OP_NO_*),而不仅仅是TLS 1.0(即使用TLS1_method())。


  

JW]我认为这与安全的重新谈判有关(但我可能是错的)。

如果我错了,那么重新协商的安全性如何:在ClientHello中插入伪密码套件。常规密码套件就像TLS_RSA_WITH_AES_256_CBC_SHA。使用的伪套件是TLS_EMPTY_RENEGOTIATION_INFO_SCSV

如果服务器无法处理TLS_EMPTY_RENEGOTIATION_INFO_SCSV,那么我认为服务器需要升级。

我不知道是否有工作的客户端选项(如SSL_OP_*标志),因为我拒绝使用损坏的服务器。我认为你可以降级到OpenSSL 0.9.8,但我不推荐它。