我想知道我是否可以在包装之前在原始套接字上重新发送/发送数据 - 我查看了文档并搜索了它但找不到具体的内容。我基本上想做的事情:
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的策略请求。与闪存的连接将是安全的,但政策请求不是
答案 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将正确处理此问题并在验证策略响应后重新连接。