我需要从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?
答案 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,但我不推荐它。