web-dev-qa-db-ja.com

Python-SSL-バージョン番号が間違っています

これはおそらく別の未解決のスレッドになるでしょうが、とにかくいくつかの情報を記入します。

SSLを1秒もラッピングできない。 wrap_socket()とdo_handshake()で私が間違っていることに対するアイデアはありますか?

キーファイルは100%完全であるように見え、ハンドシェイクの前に.recv()なしでANDを使用して試しました。それは私が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:error:140940E5:SSL routines:SSL3_READ_BYTES:ssl handshake failure

となし:

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 routines'、 'SSL23_READ'、 'ssl handshake failure')]


これが私が今いるところです:

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では[〜#〜] not [〜#〜]です。どうして?違いは何ですか? -.-

14
Torxed

Pythonはわかりません。コードに問題があるかどうかを教えてください。
エラーは明らかです。クライアントはSSLv3をサポートし、サーバーはTLSv1のみをサポートします。
そのため、SSLv3のサポートを有効にするか、クライアントをアップグレードする必要があります。

この行が問題のようです:ssl_version=ssl.PROTOCOL_TLSv1。おそらく、ここにSSLv3を追加することもできますか?

更新:
ブラウザ間で問題が発生しているようです。 CromeでSSLv3が有効になっているかどうかを確認します。
IEたとえば、これはInternet Options-> Advanced Tabの下にあります。
同様のものがChromeにあるはずです。代わりにSSv3を無効にし、代わりにTLSv1を有効にします

7
Cratylus