2012-04-01 6 views
5

이것은 아마도 다른 미해결 스레드 일 테지만 어쨌든 일부 정보는 채울 것입니다.Python - SSL - 버전 번호가 잘못되었습니다.

잠시라도 SSL 래핑을 수행 할 수 없습니다. 내 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 

을 실패합니다 :)

을 핸드 셰이크의

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)와 수 :

나는 SSLv3에 노력하고 또한 랩하는 비트의 위치를 ​​변경, 코드 약간 수정 또한

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

:

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

및없이은 내가 트위스트를 사용하는 것을 거부

스케일링 가지 아래 :

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"작동하지만, 구글 크롬에서 NOT. 왜? 차이점이 뭐야? -.-

+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

SSLv3 제거는 FireFox에서 작동합니다. SSLv3은 TLSv1보다 오래되었으므로 TLSv1을 사용합니다. – Torxed

관련 문제