openssl - PyOpenSSL 和 openssl 1.1.1g 的 SSL 握手错误
问题描述
我试图找出一个问题,我的 python 程序使用 pyopenssl(20.0.1 - 最新)在 SSL 握手(104,'ECONNRESET')期间出现异常。
我的代码如下所示:
ctx = SSL.Context(SSL.TLSv1_2_METHOD)
ctx.check_hostname = False
ctx.verify_mode = SSL.VERIFY_NONE
ctx.set_options(SSL.OP_NO_TLSv1_3)
sock.setblocking(1)
sock_ssl = SSL.Connection(ctx, sock)
sock_ssl.set_connect_state()
sock_ssl.set_tlsext_host_name(hostname_idna)
try:
sock_ssl.do_handshake()
except Exception as e:
logger.error("SSL Handshake error when connecting to {}:{}): {}".format(hostname, port, e))
cert = sock_ssl.get_peer_certificate()
我在两个不同的平台上执行这个,每个平台都有 Python 3.6.6 但不同的 openssl 版本:
# openssl version
OpenSSL 1.1.1g FIPS 21 Apr 2020
#openssl ciphers -v | awk '{print $2}' | sort | uniq
SSLv3
TLSv1
TLSv1.2
TLSv1.3
使用 OpenSSL 1.1.1g,SSL 握手失败,使用 ECONNRESET,使用 OpenSSL 1.1.1d,SSL 握手成功。
当我尝试直接执行 SSL 握手时,我确实得到了以下输出:
# openssl s_client -connect www.xxxlutz.at:443 -tls1_2
CONNECTED(00000003)
write:errno=104
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 215 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
SSL-Session:
Protocol : TLSv1.2
Cipher : 0000
Session-ID:
Session-ID-ctx:
Master-Key:
PSK identity: None
PSK identity hint: None
SRP username: None
Start Time: 1621432160
Timeout : 7200 (sec)
Verify return code: 0 (ok)
Extended master secret: no
与较旧的 openssl 版本相同的 SSL 握手会产生截然不同的输出(列出的证书等)
我错过了什么吗?似乎 openssl 版本 1.1.1g 期待一些额外的信息来执行成功的握手?
谢谢!
解决方案
推荐阅读
- javascript - 为什么 socket.io-client 的 socket.on() 会被多次触发?
- javascript - 使用 Javascript 从 Cutt.ly api 代码中提取短 url
- r - 绘制没有直方图的密度线
- webhooks - 来自 webhook 的 Google Assistant 响应无效:无法将 JSON 转换为 ExecuteHttpResponse
- javascript - Textarea 编辑器不工作,但 textarea 自己工作
- javascript - 如何将现有按钮的功能分配给新按钮?
- php - PHP将$stmt的值与整数进行比较
- javascript - 节点 js SyntaxError:意外的令牌“导出”
- java - 如何收集使用一种方法的接收器变量作为参数的方法名称
- coq - Coq:在两个等效的 setoid 之间重写