[英]Python SSL Server - Client Hello w/ only Cipher Suite: TLS_DH_anon_WITH_AES_256_CBC_SHA (0x003a) Fails
我试图让客户端与我的Python服务器脚本建立TLSv1连接。 我不确定为什么它不起作用......
在Client Hello中,唯一提供的密码套件是TLS_DH_anon_WITH_AES_256_CBC_SHA(0x003a) - 如WireShark所述。
无论我在ssl_wrapper中定义了什么,我都尝试将密码保留在定义之外,如代码“ADH-AES256-SHA”,“ALL”,“ALL:eNULL”,“ADH”中所示。 我总是得到没有共享密码的回复。
我在Linux中使用Windows Python 3.5.1和Python 2.7.9都尝试了这一点。 同样的问题。
如果我在Linux或cygwin中使用openssl s_server进行调试它正在运行...
openssl s_server -accept 22939 -cert server.crt -key private_key.pem -cipher'ADH-AES256-SHA'-debug
cygwin openssl 1.0.2e
linux openssl 1.0.1k
码:
import socket, ssl
tcpSocket = socket.socket()
tcpSocket.bind(('', 22939))
tcpSocket.listen(5)
while True:
newsocket, fromaddr = tcpSocket.accept()
sslSocket = ssl.wrap_socket(newsocket,
server_side=True,
certfile="server.crt",
keyfile="private_key.pem",
ciphers="ADH-AES256-SHA"
)
try:
#Later add stuff
finally:
sslSocket.shutdown(socket.SHUT_RDWR)
sslSocket.close()
Python错误:
File "C:\Program Files (x86)\Python35-32\lib\ssl.py", line 1064, in wrap_socket
ciphers=ciphers)
File "C:\Program Files (x86)\Python35-32\lib\ssl.py", line 747, in __init__
self.do_handshake()
File "C:\Program Files (x86)\Python35-32\lib\ssl.py", line 983, in do_handshake
self._sslobj.do_handshake()
File "C:\Program Files (x86)\Python35-32\lib\ssl.py", line 628, in do_handshake
self._sslobj.do_handshake()
ssl.SSLError: [SSL: NO_SHARED_CIPHER] no shared cipher (_ssl.c:645)
Wireshark的客户问候:
TLSv1 Record Layer: Handshake Protocol: Client Hello
Content Type: Handshake (22)
Version: TLS 1.0 (0x0301)
Length: 45
Handshake Protocol: Client Hello
Handshake Type: Client Hello (1)
Length: 41
Version: TLS 1.0 (0x0301)
Random
GMT Unix Time: Jan 9, 2016 20:34:56.000000000 W. Europe Standard Time
Random Bytes: a5e0011a6307dc4328eb9a2779a5f22a2eea8d607c8a1297...
Session ID Length: 0
Cipher Suites Length: 2
Cipher Suites (1 suite)
Cipher Suite: TLS_DH_anon_WITH_AES_256_CBC_SHA (0x003a)
Compression Methods Length: 1
Compression Methods (1 method)
Compression Method: null (0)
主要问题可能是您使用的是DH密码,但没有任何DH参数。 虽然openssl s_server
内置了一些默认的DH params,但ssl.wrap_socket
不是这样,你必须明确设置它们。 有关示例,请参见http://nullege.com/codes/search/ssl.SSLContext.load_dh_params 。
除此之外,将证书与匿名密码一起使用是没有意义的,即明确不需要证书的密码。
感谢Steffen,经过无数次故障排除后,我能够轻松地完成这项工作。
以防其他人有这个问题在这里是代码中的解决方案:
首先生成PEM dhparams文件
openssl dhparam -5 -outform PEM -out dhparam.pem
Python代码:
import socket, ssl
tcpSocket = socket.socket()
tcpSocket.bind(('', 22939))
tcpSocket.listen()
while True:
newsocket, fromaddr = tcpSocket.accept()
sslContext = ssl.SSLContext(ssl.PROTOCOL_TLSv1)
sslContext.set_ciphers("ADH-AES256-SHA")
sslContext.load_dh_params("dhparam.pem")
sslSocket = sslContext.wrap_socket(newsocket,
server_side=True,
)
try:
#Later add stuff
finally:
sslSocket.shutdown(socket.SHUT_RDWR)
sslSocket.close()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.