2016-10-16 61 views
0

我正在尝试使用python套接字向域注册服务器发出可扩展配置协议(EPP)请求,该域注册服务器只通过ssl接受请求。Python套接字SSL:证书验证失败

证书文件:www.myDomain.se.crt 密钥文件: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)。 –

相关问题