1. ホーム
  2. python

[解決済み] Python - SSL - バージョン番号が間違っている

2022-01-28 01:50:16

質問

これは多分、ただの未解決スレッドになると思いますが、とりあえず情報を記入します。

SSLが一瞬たりともまとまりません。 私のwrap_socket()とdo_handshake()で何が間違っているのか、何かアイデアはありますか?

鍵ファイルは100%完璧に見えます。ハンドシェイクの前に.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: 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)

これは、"native" 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で表示させることができます。 なぜでしょうか、何が違うのでしょうか?-.-

解決方法は?

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

この行が問題になっているようです。 ssl_version=ssl.PROTOCOL_TLSv1 . おそらく、次のように追加することもできます。 SSLv3 ここで?

更新しました。
ブラウザ間で問題が発生しているようですね。以下を参照してください。 SSLv3 がCromeで有効になっている。
IEでは、例えば以下のようになります。 Internet Options -> Advanced Tab .
Chromeでも似たようなものがあるはずです。無効化する SSv3 を有効にし TLSv1 代わりに