2012-04-01 34 views
5

Điều này có thể sẽ chỉ là một chuỗi chưa được giải quyết khác nhưng tôi sẽ điền vào một số thông tin.Python - SSL - sai số phiên bản

Tôi không thể kết nối SSL với nhau ngay cả trong một giây. Bất kỳ ý tưởng nào về những gì tôi đang làm sai với wrap_socket() và do_handshake() của tôi?

Tệp khóa có vẻ hoàn hảo 100% và tôi đã thử AND và không có dấu .recv() trước khi bắt tay. Đó chỉ tạo ra những tùy thuộc vào nơi mà tôi đặt 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 

Đối với hồ sơ, nếu nó không rõ ràng hoặc tôi sai, đó là cái bắt tay mà không :)

tôi sửa đổi mã một chút, cố gắng SSLv3 và cũng thay đổi vị trí của các gói một chút:

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) 

Bây giờ tôi nhận được với các newsocket.recv (32):

ssl.SSLError: [Errno 1] _ssl.c:1331: error:140940E5:SSL routines:SSL3_READ_BYTES:ssl handshake failure

và không có:

ssl.SSLError: [Errno 2] _ssl.c:490: The operation did not complete (read)

Ngoài ra: tôi từ chối sử dụng Twisted

Scaling điều xuống:

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) 

này hoạt động tốt như "bản địa" thư viện ssl. Tuy nhiên bây giờ tôi nhận được lỗi này:

OpenSSL.SSL.Error: [('SSL routines', 'SSL23_READ', 'ssl handshake failure')]


Đây là nơi tôi đang ở hiện nay:

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

này hoạt động "prefectly" trong Firefox, nhưng KHÔNG trong Google Chrome. Tại sao? có gì khác biệt? -.-

+0

@Toxed: Xem cập nhật trong câu trả lời – Cratylus

Trả lời

3

Tôi không biết Python chút nào để cho bạn biết nếu bạn gặp sự cố trong mã của mình.
Lỗi mặc dù là rõ ràng. Máy khách hỗ trợ SSLv3 và máy chủ của bạn chỉ TLSv1.
Vì vậy, bạn nên bật hỗ trợ cho SSLv3 hoặc nâng cấp ứng dụng khách của mình.

Dòng này có vẻ là vấn đề: ssl_version=ssl.PROTOCOL_TLSv1. Có lẽ bạn cũng có thể thêm SSLv3 vào đây?

Cập nhật:
Tôi thấy rằng bạn gặp sự cố giữa các trình duyệt. Xem nếu SSLv3 được bật trong Crome.
Trong IE, ví dụ như dưới Internet Options ->Advanced Tab.
Tương tự như vậy trong Chrome.Vô hiệu hóa và kích hoạt SSv3TLSv1 thay

+0

** thói quen SSL: SSL3_GET_RECORD: sai số phiên bản ** VỚI các recv() trước khi bắt tay được thực hiện, và nếu không có nó tôi nhận được ** _ ssl.c : 490: Thao tác không hoàn thành (đã đọc) ** – Torxed

+0

Sử dụng ** ssl_version = ssl.PROTOCOL_SSLv3, ** – Torxed

+0

Xóa SSLv3 hoạt động, trong FireFox. SSLv3 cũ hơn sau đó TLSv1 vì vậy tôi muốn gắn bó với TLSv1 – Torxed