Python SSL服务器-客户端Hello w/仅包含密码套件:TLS_DH_anon_WITH_AES_256_CBC_SHA(0x003a)失败

Python SSL服务器-客户端Hello w/仅包含密码套件:TLS_DH_anon_WITH_AES_256_CBC_SHA(0x003a)失败,python,ssl,Python,Ssl,我正在尝试让一个客户端与我的Python服务器脚本建立TLSv1连接。我不知道为什么它不起作用 在客户端Hello中,提供的唯一密码套件是TLS_DH_anon_和_AES_256_CBC_SHA(0x003a)——如WireShark中所述 无论我在ssl_包装中定义了什么,我都尝试将密码=排除在定义之外,正如您在代码“ADH-AES256-SHA”、“ALL”、“ALL:eNULL”、“ADH”中看到的那样。我总是得到没有共享密码的响应 我已经在Linux的Windows Python 3.

我正在尝试让一个客户端与我的Python服务器脚本建立TLSv1连接。我不知道为什么它不起作用

在客户端Hello中,提供的唯一密码套件是TLS_DH_anon_和_AES_256_CBC_SHA(0x003a)——如WireShark中所述

无论我在ssl_包装中定义了什么,我都尝试将密码=排除在定义之外,正如您在代码“ADH-AES256-SHA”、“ALL”、“ALL:eNULL”、“ADH”中看到的那样。我总是得到没有共享密码的响应

我已经在Linux的Windows Python 3.5.1和Python 2.7.9中尝试过这一点。同样的问题

如果我在Linux或cygwin中使用openssl s_服务器进行调试,它将正常工作

openssl s_服务器-接受22939-cert server.crt-key private_key.pem-密码“ADH-AES256-SHA”-调试

cygwin openssl 1.0.2e

linux openssl 1.0.1k

代码:

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_服务器
内置了一些默认的DH参数,
ssl.wrap_socket
没有,因此您必须显式设置这些参数。有关示例,请参见


除此之外,将证书与匿名密码(即明确不需要证书的密码)一起使用是没有意义的。

多亏了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()

在服务器中提供证书并使用anon密码(即不使用证书)是没有意义的。您的权利是不使用的,但如果您在python中尝试openssl s_服务器命令或ssl_包装器,但未定义证书,它会抱怨并无法执行。虽然这可能是OpenSSL库中的一个bug,但目前这不是我的目标。Steffen,谢谢,这正是我所需要的,现在一切都正常了。
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()