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

OpenSSL问题不支持安全重新协商,openssl,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 有没有办法将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

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

协议版本是为入站和出站协商的。它是
ClientHello
的一部分。虽然服务器使用的协议版本比客户端公布的版本要低,但您不能混用

OpenSSL允许您定义
OpenSSL\u NO\u TLS1
,但我相信这会杀死所有TLS,而不仅仅是TLS 1.1和TLS 1.2

默认情况下,某些Linux发行版在客户端上禁用TLS 1.2。例如,Ubuntu在12和13个月内都这样做。他们通过OpenSSL的
OpenSSL\u NO\u TLS1\u 2\u客户端来实现:

$ /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。但是您需要再次编译您的程序

下面介绍如何使用
方法
(注意
TLSv1\u方法()
)执行此操作:

或者,您可以使用标志来执行此操作:

/* 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方法还允许我指定“TLS1.0及以上”(即使用
SSLv23\u方法()
SSL\u OP\u NO.*
),而不仅仅是TLS1.0(即使用
TLS1\u方法()


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

如果我错了,下面是安全重新协商的工作原理:在
ClientHello
中插入一个伪密码套件。常规密码套件类似于
TLS\u RSA\u WITH\u AES\u 256\u CBC\u SHA
。使用的伪套件是
TLS\u EMPTY\u RENEGOTIATION\u INFO\u SCSV

如果服务器无法处理
TLS\u EMPTY\u RENEGOTIATION\u INFO\u SCSV
,那么我认为服务器需要升级


我不知道是否有客户端选项可以使用(比如
SSL\u OP.*
标志),因为我拒绝使用损坏的服务器。我认为您可以降级到OpenSSL 0.9.8,但我不建议您这样做。

Thnaks供您回答。作为一个noob,我很可能对我的问题措词不正确。我需要连接到不提供TLS重新协商且仅与TLSv1通信的服务器。我从一个RedHa服务器连接,在那里我们为Heartbleed修补了SSL,因此通过尝试与TLSv1.2协商来开始任何握手。因此,接收服务器没有响应。有没有一种方法可以在我的服务器上禁用TLSv1.2和TLSv1.1,而无需在禁用这些协议的情况下编译我自己的openssl?@user3421121-答案中添加了更多信息。我想它涵盖了你的评论。非常感谢你的回答,我将尝试一下。我同意你关于服务器损坏的评论,但拥有这项云服务的微软表示,他们无意做出任何改变。因此,当我们的客户希望我们使用该产品时,我们必须找到一种方法使其工作。
/* 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);
...