gpt4 book ai didi

linux - python中使用ssl握手失败如何解决?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:31:58 24 4
gpt4 key购买 nike

我尝试连接到特定的 https 服务器:

socketHandler = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socketWraped = ssl.wrap_socket(socketHandler)
socketWraped.connect(('certificatedetails.com', 443))

但是 python 说:

File "/usr/lib/python3.6/ssl.py", line 1109, in connect
self._real_connect(addr, False)
File "/usr/lib/python3.6/ssl.py", line 1100, in _real_connect
self.do_handshake()
File "/usr/lib/python3.6/ssl.py", line 1077, in do_handshake
self._sslobj.do_handshake()
File "/usr/lib/python3.6/ssl.py", line 689, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [SSL: SSLV3_ALERT_HANDSHAKE_FAILURE] sslv3 alert handshake failure (_ssl.c:852)

我尝试使用 TLS1:

socketWraped = ssl.wrap_socket(
socketHandler,
ssl_version=ssl.PROTOCOL_TLSv1,
ciphers='ADH-AES256-SHA'
)

但是说:

ssl.SSLError: [SSL: NO_CIPHERS_AVAILABLE] no ciphers available (_ssl.c:852)

在python和操作系统中升级ssl:

$ hostnamectl
Static hostname: machine
Icon name: computer-desktop
Chassis: desktop
Machine ID: ...
Boot ID: ...
Operating System: Ubuntu 18.04.2 LTS
Kernel: Linux 4.15.0-51-generic
Architecture: x86-64
$ openssl version
OpenSSL 1.1.1c 28 May 2019
$ python3 -c "import ssl; print(ssl.OPENSSL_VERSION)"
OpenSSL 1.1.1c 28 May 2019

从 netcat 可以毫无问题地连接:

$ ncat --ssl -v certificatedetails.com 443
Ncat: Version 7.60 ( https://nmap.org/ncat )
Ncat: SSL connection to 104.28.6.163:443.
Ncat: SHA-1 fingerprint: 75B3 C6AD 7A72 62B5 7104 0632 0585 A82A F542 641B

问题是什么,如何解决?

最佳答案

来自 the documentation :

Since Python 3.2 and 2.7.9, it is recommended to use the SSLContext.wrap_socket() of an SSLContext instance to wrap sockets as SSLSocket objects. The helper functions create_default_context() returns a new context with secure default settings. The old wrap_socket() function is deprecated since it is both inefficient and has no support for server name indication (SNI) and hostname matching.

当我使用 SSLContext.wrap_socket() 而不是弃用的 wrap_socket() 时,它起作用了:

socketHandler = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socketWraped = ssl.create_default_context().wrap_socket(socketHandler, server_hostname='certificatedetails.com')
socketWraped.connect(('certificatedetails.com', 443))

关于linux - python中使用ssl握手失败如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56719290/

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