recv / send в необработанном сокете перед SSL wrap (), Python - PullRequest
3 голосов
/ 13 июля 2010

Мне интересно, могу ли я получать / отправлять данные в сыром сокете перед упаковкой - я просмотрел документацию и искал ее, но не смог найти ничего конкретного.Что я в основном хочу сделать:

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 начинают затоплять.) Примите во внимание любое возможное руководство.

Примечание: мне нужно ответить на запрос политикиот вспышкиСоединение с флеш-памятью будет безопасным, но запрос политики не

Ответы [ 2 ]

1 голос
/ 14 июля 2010

В документации к do_handshake (http://docs.python.org/library/ssl.html#ssl.SSLSocket.do_handshake), который вызывается с помощью wrap_socket (как видно из вашего стека вызовов), я замечаю, что он может вызвать ошибку 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')

Еще одна альтернатива - просто запустить выделенный сервер политики Flash на порту 843.

0 голосов
/ 27 января 2012

Я полагаю, что если вы закроете сокет после запроса политики Flash, Flash выполнит это правильно и повторно подключится после проверки ответа политики.

...