2016-10-16 11 views
0

Я пытаюсь использовать сокеты python, чтобы сделать запрос расширенного Provisioning Protocol (EPP) регистратору домена, который принимает только запросы по ssl.Python Sockets SSL: проверка сертификата не выполнена

файл сертификата: www.myDomain.se.crt Key File: mydomain.pem

openssl s_client -connect epptestv3.iis.se:700 -cert www.myDomain.se.crt -key mydomain.pem 

Когда я пытаюсь сделать запрос с помощью клиента OpenSSL я успешно получить приветствие ответ от регистратора, но когда я использую следующий код в python я получаю ошибку сертификата ssl.

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
sock.settimeout(15) 
sock.connect(('epptestv3.iis.se', 700)) 
sock.settimeout(60) # regular timeout 


ssl_keyfile='myDomain.pem' 
ssl_certfile='www.myDomain.se.crt' 
ssl_ciphers='AES256-GCM-SHA384' 
ssl_version=ssl.PROTOCOL_TLSv1_2 

sock = ssl.wrap_socket(sock, 
         ssl_keyfile, 
         ssl_certfile, 
         ssl_version=ssl_version, 
         ciphers=ssl_ciphers, 
         server_side=False, 
         cert_reqs=ssl.CERT_REQUIRED, 
         ca_certs=None 
         ) 

После выполнения сценария я получаю следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "server_connect.py", line 54, in <module> 
    ca_certs=ssl_keyfile 
    File "/usr/lib/python2.7/ssl.py", line 933, in wrap_socket 
    ciphers=ciphers) 
    File "/usr/lib/python2.7/ssl.py", line 601, in __init__ 
    self.do_handshake() 
    File "/usr/lib/python2.7/ssl.py", line 830, in do_handshake 
    self._sslobj.do_handshake() 
ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590) 

Любая идея, что случилось здесь?

ответ

2

Из кода:

    cert_reqs=ssl.CERT_REQUIRED, 
        ca_certs=None 

От documentation of wrap_socket:

If the value of this parameter is not CERT_NONE, then the ca_certs parameter must point to a file of CA certificates.

По сути вы задаете в своем коде для проверки сертификата сервера (CERT_REQUIRED), но указать в то же время, у вас нет доверенного корня (ca_certs=None). Но без доверенных корневых сертификатов проверка не может быть выполнена.

Обратите внимание, что если использовать код CERT_NONE, это будет плохой идеей. Вероятно, это сработает, поскольку проверка сертификата не будет выполнена, но он будет открыт для людей при средних атаках.

+0

Фактически я пробовал, предоставляя 'ca_certs' тоже, но это не помогает. –

+0

@OsamaRasheed: это зависит от того, какое содержимое файла вы указали с помощью 'ca_certs'. В вашем случае вам, вероятно, понадобится [этот сертификат] (https://www.tbs-certificates.co.uk/FAQ/en/357.html) в файле. –