【问题标题】:recv/send on raw socket before SSL wrap(), Python在 SSL wrap() 之前在原始套接字上接收/发送,Python
【发布时间】:2011-03-15 05:03:06
【问题描述】:

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

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 的策略请求。与 flash 的连接将是安全的,但策略请求不安全

【问题讨论】:

    标签: python ssl sockets python-3.x


    【解决方案1】:

    我在 do_handshake (http://docs.python.org/library/ssl.html#ssl.SSLSocket.do_handshake) 的文档中注意到,它由 wrap_socket 调用(从您的调用堆栈中可以看出),它可能会在非阻塞套接字上引发 ssl.SSLError,您必须将其包装在try/except 尝试直到它起作用。因此,在您的情况下,如果您需要一个非阻塞套接字,您需要先自己进行握手并将 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 策略服务器。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-17
        • 2023-03-17
        • 1970-01-01
        • 1970-01-01
        • 2010-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多