gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 12:51:46 26 4
gpt4 key购买 nike

我需要从 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?

最佳答案

Is there a way to configure OpenSSL to not use TLSv1.2 and TLSv1.1 in outbound communications?



协议(protocol)版本是为入站和出站协商的。它的一部分 ClientHello .虽然服务器可以使用比客户端宣传的更低的协议(protocol)版本,但您不能混合和匹配。

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"

Secure Renegotiation is not supported OpenSSL issue



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

编辑 (来自评论):

I am connecting from a RedHat server where we have patched SSL for Heartbleed and so starts any handshake by trying to negoitate with TLSv1.2. As such the receiving server doesn't respond.



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

以下是如何以编程方式执行此操作。您不需要再次编译 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 方法,因此我可以禁用损坏的协议(protocol)(如 SSLv2)和损坏的功能(如压缩)。 flags 方法还允许我指定“TLS 1.0 及更高版本”(即, SSLv23_method()SSL_OP_NO_* ),而不仅仅是 TLS 1.0(即,使用 TLS1_method() )。

JW] I don't think that has to do with secure renegotiation (but I could be wrong).



如果我错了,这里是安全重新协商的工作原理:伪密码套件插入 ClientHello .常规密码套件类似于 TLS_RSA_WITH_AES_256_CBC_SHA .使用的伪套件是 TLS_EMPTY_RENEGOTIATION_INFO_SCSV .

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

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

关于openssl - 不支持安全重新协商 OpenSSL 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24124814/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com