有没有办法将 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 问题
这是您的问题的标题,它是一个单独的问题。你有什么问题?
编辑(来自 cmets):
我正在从我们为 Heartbleed 修补 SSL 的 RedHat 服务器连接,因此通过尝试与 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,但我不建议这样做。