Python 套接字 SSL:证书验证失败
Python Sockets SSL: certificate verify failed
我正在尝试使用 python 套接字向域注册商发出可扩展配置协议 (EPP) 请求,该域注册商仅接受通过 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)
知道这里出了什么问题吗?
来自您的代码:
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
并不是一个好主意。它可能会起作用,因为不会进行证书验证,但它会对中间人攻击开放。
我正在尝试使用 python 套接字向域注册商发出可扩展配置协议 (EPP) 请求,该域注册商仅接受通过 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)
知道这里出了什么问题吗?
来自您的代码:
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
并不是一个好主意。它可能会起作用,因为不会进行证书验证,但它会对中间人攻击开放。