我在 Python 程序中将现有的套接字连接包装在 ssl 中时遇到了一些问题。本质上,它是 STARTTLS 的实现,即当前连接的客户端可以发出 STARTTLS 命令,服务器将保护连接。
这是我正在努力解决的代码部分:
self.client_s = ssl.wrap_socket(
self.client_s,
certfile='/path/to/cert.crt',
keyfile='/path/to/key.key',
do_handshake_on_connect=False
)
while True:
try:
self.client_s.do_handshake()
break
except ssl.SSLError, e:
if e.args[0] == ssl.SSL_ERROR_WANT_READ:
select([self.client_s], [], [])
elif e.args[0] == ssl.SSL_ERROR_WANT_WRITE:
select([], [self.client_s], [])
else: raise
当我使用 openssl 连接时,我得到以下信息:
_ssl.c:491: error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol
我通过运行这个来连接:
openssl s_client -connect localhost:50000 -crlf -starttls smtp -debug -ssl3
将 openssl 命令更改为使用-ssl2
、-no_ssl2
或-tls1
没有帮助。我也尝试过添加server_side=True to wrap_socket()
,但只会导致 ssl 握手超时。
我应该注意,wrap_socket()
当连接从头到尾加密时工作正常,而不是当我尝试在 STARTTLS 上下文中使用它时。
Python 版本是 2.4.3
在此先感谢,我感谢任何指示或帮助。