我有简单的客户端/服务器 SSL 代码,在 Python 3.2 上运行良好。但是,我决定切换到 2.7(由于大量第三方模块),现在代码失败了。代码如下:
客户:
def connect(self):
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.connect(('localhost', 4430))
self.ssl_sock = ssl.wrap_socket(self.sock, cert_reqs = ssl.CERT_NONE, ssl_version = ssl.PROTOCOL_TLSv1)
服务器:
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sock.bind((self.hostname, 4430))
self.sock.listen(5)
while True:
self.newsocket, self.fromaddr = self.sock.accept()
self.ssl_sock = ssl.wrap_socket(
self.newsocket,
server_side = True,
certfile = "cert.pem",
ssl_version=ssl.PROTOCOL_TLSv1
)
self._handle_client(self.ssl_sock)
cert.pem(与服务器 .py 文件位于同一目录中):
-----BEGIN RSA PRIVATE KEY-----
(812 "random" characters here)
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
(1260 "random" characters here)
-----END CERTIFICATE-----
失败如下:
1. server 在 self.sock.accept() 上等待
2. client 用 self.sock.connect() 连接
3. server 继续 wrap_socket,失败并出现以下错误:
Traceback (most recent call last):
File "C:\Program Files\Python27\lib\multiprocessing\process.py", line 258, in _bootstrap
self.run()
File "C:\workspace\projectc\server\server\clientlistener.py", line 49, in run
ssl_version=ssl.PROTOCOL_TLSv1
File "C:\Program Files\Python27\lib\ssl.py", line 381, in wrap_socket
ciphers=ciphers)
File "C:\Program Files\Python27\lib\ssl.py", line 141, in __init__
ciphers)
SSLError: [Errno 336265218] _ssl.c:351: error:140B0002:SSL routines:SSL_CTX_use_PrivateKey_file:system lib
PS
1)我怀疑 wrap_socket 调用,因为即使我使用不存在的文件作为 certfile,也会产生相同的错误。
2)我在ssl上的python文档上尝试了替代包装(即使用ssl.SSLContext),奇怪的是'module'对象没有属性'SSLContext',当它是ssl模块的一部分时。当我使用 Python 3.2 进行尝试时,这不是问题。
更新:
我发现问题只发生在我从 Eclipse 中“运行”时,而不是当我从单独的命令提示符运行这两个文件时。还在调查这个问题...
更新 2: 我尝试了一个非常简单的客户端/服务器脚本,代码相同,它可以工作。现在,由于服务器代码位于多处理子进程中(由主服务器进程启动),它似乎无法正常工作。有关的?