2012-04-01 17 views
5

これはたぶん別の未解決のスレッドですが、とにかく情報を入力します。Python - SSL - 間違ったバージョン番号

私のSSLラッピングは1秒間でも一緒にはできません。 私のwrap_socket()とdo_handshake()で間違っていることについてのアイデアはありますか?

鍵ファイルは完全に100%のようですが、私はハンドシェイクの前に.recv()を付けずにANDで試してみました。ちょうど私がRECV()置く場所に応じてこれらを生成 :それは明らかではないですか、私が間違っている場合は、レコードのために

SSL3_GET_CLIENT_HELLO:wrong version number

SSL3_GET_RECORD:wrong version number

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: The operation did not complete (read)

私は物事をダウンスケーリングツイスト

を使用することを拒否:

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)) 

これは "prefectly" Firefoxで動作しますが、Google Chromeでませ。 なぜですか?違いは何ですか? -.-

+0

が@Toxed有効:答え – Cratylus

答えて

3

コードに問題がある場合は、Pythonを教えてください。
エラーはクリアです。クライアントはSSLv3をサポートし、サーバーはTLSv1のみをサポートします。
SSLv3のサポートを有効にするか、クライアントをアップグレードする必要があります。

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

更新:
ブラウザ間に問題があることがわかります。 CromeでSSLv3が有効になっているかどうかを確認してください。
IEの場合、これはInternet Options - >Advanced Tabです。
類似のものはChromeにある必要があります。SSv3を無効にしTLSv1代わり

+0

で更新を参照してください。** SSLルーチン:SSL3_GET_RECORD:ハンドシェイクが行われる前のrecv()で間違ったバージョン番号**を、そしてそれなしで私を得る** _ ssl.c :490:操作が完了しませんでした。** – Torxed

+0

** ssl_version = ssl.PROTOCOL_SSLv3、** – Torxed

+0

を使用すると、FireFoxのSSLv3が削除されます。 SSLv3はTLSv1より古くなっているので、TLSv1を使用してください。 – Torxed

関連する問題