Python - SSL - неправильный номер версии - PullRequest
11 голосов
/ 01 апреля 2012

Вероятно, это будет еще одна нерешенная тема, но я все равно внесу некоторую информацию.

Я не могу собрать свой SSL-пакет даже на секунду. Любые идеи о том, что я делаю не так с моими wrap_socket () и do_handshake ()?

Файлы ключей, кажется, на 100% совершенны, и я пробовал с AND без .recv () до рукопожатия. Это просто генерирует их в зависимости от того, куда я положил recv ():

SSL3_GET_CLIENT_HELLO: неправильный номер версии

SSL3_GET_RECORD: неправильный номер версии

class Server():
    def __init__(self, listen = '', port = 8080, ssl = False):
        self.sock = socket.socket()
        self.sock.bind((listen, port))
        self.sock.listen(5)

    def accept(self):
        newsocket, fromaddr = self.sock.accept()
        newsocket.recv(32)
        newsocket.setblocking(0)
        sslsock = ssl.wrap_socket(newsocket,
                                    server_side=True,
                                    certfile="./kernel/sock/server.crt",
                                    keyfile="./kernel/sock/server.key",
                                    cert_reqs=ssl.CERT_NONE,
                                    ssl_version=ssl.PROTOCOL_TLSv1,
                                    do_handshake_on_connect=False,
                                    suppress_ragged_eofs=True)
        sslsock.do_handshake()
        return sslsock, fromaddr

Для справки, если это не очевидно или я ошибаюсь, рукопожатие терпит неудачу:)

Я немного изменил код, попробовав SSLv3, а также немного изменил положение переноса:

import socket, ssl, time, select

class Server():
    def __init__(self, listen = '', port = 443, ssl = False):
        self.sock = socket.socket()
        self.sock.bind((listen, port))
        self.sock.listen(5)

    def accept(self):
        self.sock = ssl.wrap_socket(self.sock,
                                    server_side=True,
                                    certfile="./kernel/sock/server.crt",
                                    keyfile="./kernel/sock/server.key",
                                    cert_reqs=ssl.CERT_NONE,
                                    ssl_version=ssl.PROTOCOL_SSLv3,
                                    do_handshake_on_connect=False,
                                    suppress_ragged_eofs=True)

        newsocket, fromaddr = self.sock.accept()

        print [newsocket.recv(32)]
        newsocket.setblocking(False)
        newsocket.do_handshake()

        return newsocket, fromaddr

s = Server()
ns, na = s.accept()
print ns.recv(1024)

Теперь я получаю с newsocket.recv (32):

ssl.SSLError: [Errno 1] _ssl.c: 1331: ошибка: 140940E5: подпрограммы SSL: SSL3_READ_BYTES: сбой рукопожатия ssl

и без:

ssl.SSLError: [Errno 2] _ssl.c: 490: операция не завершена (чтение)

Также: я отказываюсь использовать Twisted

Уменьшение количества вещей:

import socket, ssl, time, select
from OpenSSL import SSL

class Server():
    def __init__(self, listen = '', port = 443, ssl = False):
        ctx = SSL.Context(SSL.SSLv23_METHOD)
        ctx.use_privatekey_file("server.pem")
        ctx.use_certificate_file("server.pem")
        self.sock = SSL.Connection(ctx, socket.socket())

        self.sock.bind((listen, port))
        self.sock.listen(5)

    def accept(self):
        newsocket, fromaddr = self.sock.accept()
        return newsocket, fromaddr

s = Server()
ns, na = s.accept()
print ns.recv(1024)

Это работает так же хорошо, как "нативная" библиотека ssl. Однако теперь я получаю эту ошибку:

OpenSSL.SSL.Error: [('Подпрограммы SSL', 'SSL23_READ', 'Ошибка рукопожатия ssl')]


Это то место, где я сейчас нахожусь:

import socket, ssl, time #, select

class Server():
    def __init__(self, listen = '', port = 443, ssl = False):
        self.sock = socket.socket()
        self.sock.bind((listen, port))
        self.sock.listen(5)

    def accept(self):
        self.ssl_sock = None
        while not self.ssl_sock:
            self.ssl_sock = ssl.wrap_socket(self.sock,
                server_side=True,
                certfile=r"C:\moo.pem",
                keyfile=r"C:\moo.key",
                cert_reqs=ssl.CERT_NONE,
                ssl_version=ssl.PROTOCOL_TLSv1)

        newsocket, fromaddr = self.ssl_sock.accept()

        print([newsocket.recv()])

        return newsocket, fromaddr

s = Server()
ns, na = s.accept()
print(ns.recv(1024))

Это работает "идеально" в Firefox, но НЕ в Google Chrome. Зачем? какая разница? -.-

1 Ответ

7 голосов
/ 01 апреля 2012

Я вообще не знаю Python, чтобы сообщить вам, если у вас есть проблема в вашем коде.
Ошибка очевидна.Клиент поддерживает SSLv3, а ваш сервер только TLSv1.
. Поэтому вам следует включить поддержку SSLv3 или обновить ваш клиент.

В этой строке, похоже, проблема: ssl_version=ssl.PROTOCOL_TLSv1.Возможно, вы также можете добавить SSLv3 здесь?

Обновление:
Я вижу, что у вас проблема между браузерами.Посмотрите, включен ли SSLv3 в Crome.
В IE, например, он находится под Internet Options -> Advanced Tab.
Нечто подобное должно быть в Chrome.Отключить SSv3 и включить TLSv1 вместо

...