包装在SSL现有的插座 - 的Python(Wrapping an existing socket

2019-09-21 07:20发布

我有一些麻烦,包裹在一个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是

在此先感谢,我明白任何指针或帮助。

文章来源: Wrapping an existing socket in SSL - Python