2012-04-01 21 views
5

यह शायद एक और अनसुलझा धागा होगा लेकिन मैं वैसे भी कुछ जानकारी भर दूंगा।पायथन - एसएसएल - गलत संस्करण संख्या

मैं अपने एसएसएल रैपिंग को एक सेकंड के लिए भी नहीं मिला। मेरे wrap_socket() और do_handshake() के साथ मैं क्या गलत कर रहा हूं, इसके बारे में कोई विचार?

कुंजी फ़ाइलें 100% सही दिखाई देती हैं, और मैंने हैंडशेक से पहले .recv() के साथ और बिना प्रयास किया है। बस उत्पन्न करता है यही कारण है कि इन पर जहां मैं 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) 

यह बस के रूप में "मूल" के रूप में अच्छा काम करता है एसएसएल पुस्तकालय।

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" फ़ायरफ़ॉक्स में है, लेकिन नहीं गूगल क्रोम में। क्यों? क्या फर्क पड़ता है? -.-

+0

@Toxed सक्षम: इस सवाल का जवाब – Cratylus

उत्तर

3

मुझे आपके कोड में कोई समस्या होने पर आपको यह बताने के लिए पाइथन नहीं पता है।
त्रुटि हालांकि स्पष्ट है। ग्राहक SSLv3 और आपके सर्वर का केवल TLSv1 का समर्थन करता है।
तो आपको SSLv3 के लिए समर्थन सक्षम करना चाहिए या अपने क्लाइंट को अपग्रेड करना चाहिए।

यह लाइन समस्या है: ssl_version=ssl.PROTOCOL_TLSv1। शायद आप SSLv3 भी जोड़ सकते हैं?

अद्यतन:
मुझे लगता है कि आपको ब्राउज़र के बीच समस्या है। देखें कि क्रोम में SSLv3 सक्षम है या नहीं।
आईई में उदाहरण के लिए यह Internet Options ->Advanced Tab के तहत है।
क्रोम में कुछ समान होना चाहिए।SSv3 अक्षम करें और TLSv1 बजाय

+0

में अद्यतन देखें ** एसएसएल दिनचर्या: SSL3_GET_RECORD: recv() से पहले हाथ मिलाना किया जाता है के साथ गलत संस्करण नंबर **, और इसके बिना मैं मिल ** _ ssl.c : 4 9 0: ऑपरेशन पूर्ण नहीं हुआ (पढ़ा गया) ** – Torxed

+0

** ssl_version = ssl.PROTOCOL_SSLv3 का उपयोग कर, ** – Torxed

+0

फ़ायरफ़ॉक्स में SSLv3 कार्यों को हटा रहा है। एसएसएलवी 3 पुराना है तो टीएलएसवी 1 इसलिए मैं टीएलएसवी 1 – Torxed

संबंधित मुद्दे