在SSL wrap(),Python之前对原始套接字进行recv / send

时间:2010-07-13 08:44:25

标签: python ssl sockets python-3.x

我想知道我是否可以在包装之前在原始套接字上重新发送/发送数据 - 我查看了文档并搜索了它但找不到具体的内容。我基本上想做的事情:

client, addr = listeningSocket.accept()
client.recv(32)
client.send(b'hello')
client.setblocking(0)
sslSocket = ssl.wrap_socket(client, keyfile='key.pem', certfile='cert.pem', server_side=True, ssl_version=ssl.PROTOCOL_TLSv1)
sslSocket.write(b'hello')

问题是我得到一个错误,我很确定在包装之前与client.recv()有关(或者至少我认为是因为我在添加recv之前没有得到它?)

sslSocket = ssl.wrap_socket(client, keyfile='key.pem', certfile='cert.pem', server_side=True, ssl_version=ssl.PROTOCOL_TLSv1)
  File "/usr/lib/python3.1/ssl.py", line 381, in wrap_socket
    suppress_ragged_eofs=suppress_ragged_eofs)
  File "/usr/lib/python3.1/ssl.py", line 135, in __init__
    raise x
  File "/usr/lib/python3.1/ssl.py", line 131, in __init__
    self.do_handshake()
  File "/usr/lib/python3.1/ssl.py", line 327, in do_handshake
    self._sslobj.do_handshake()
ssl.SSLError: [Errno 8] _ssl.c:488: EOF occurred in violation of protocol

这合法吗?无论如何都要这样做(我真的需要在包装之前发送,因为客户端在SSL数据开始泛滥之前需要一个原始字符串。)感谢任何可能的指导。

注意:我需要响应来自flash的策略请求。与闪存的连接将是安全的,但政策请求不是

2 个答案:

答案 0 :(得分:1)

我在do_handshake(http://docs.python.org/library/ssl.html#ssl.SSLSocket.do_handshake)的文档中注意到,它由wrap_socket调用(从你的callstack中显而易见),它可能会在非阻塞套接字上引发一个ssl.SSLError,你必须将它包装起来在尝试/除尝试,直到它的工作。所以在你的情况下,如果你需要一个非阻塞套接字,你需要先自己做握手并将do_handshake_on_connect = False传递给wrap_socket,或者等到握手后再设置非阻塞:

client, addr = listeningSocket.accept()
client.recv(32)
client.send(b'hello')
sslSocket = ssl.wrap_socket(client, keyfile='key.pem', certfile='cert.pem', server_side=True, ssl_version=ssl.PROTOCOL_TLSv1)
client.setblocking(0)
sslSocket.write(b'hello')

或者也许:

client, addr = listeningSocket.accept()
client.recv(32)
client.send(b'hello')
client.setblocking(0)

while True:
    try:
        client.do_handshake()
        break
    except ssl.SSLError, err:
        if err.args[0] == ssl.SSL_ERROR_WANT_READ:
            select.select([client], [], [])
        elif err.args[0] == ssl.SSL_ERROR_WANT_WRITE:
            select.select([], [client], [])
        else:
            raise

sslSocket = ssl.wrap_socket(client, do_handshake_on_connect=False, keyfile='key.pem', certfile='cert.pem', server_side=True, ssl_version=ssl.PROTOCOL_TLSv1)
sslSocket.write(b'hello')

另一种替代方法是在端口843上运行专用的Flash策略服务器。

答案 1 :(得分:0)

我相信如果您在Flash策略请求后关闭套接字,Flash将正确处理此问题并在验证策略响应后重新连接。