Python Sockets SSL: сбой проверки сертификата
Я пытаюсь использовать 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)
Есть идеи, что здесь не так?
1 ответ
Из вашего кода:
cert_reqs=ssl.CERT_REQUIRED,
ca_certs=None
Если значение этого параметра не CERT_NONE, то параметр ca_certs должен указывать на файл сертификатов CA.
По сути, вы просите в своем коде проверить сертификат с сервера (CERT_REQUIRED
), но при этом укажите, что у вас нет доверенного корня (ca_certs=None
). Но без доверенных корневых сертификатов проверка невозможна.
Обратите внимание, что изменение вашего кода для использования CERT_NONE
вместо этого была бы плохая идея. Это, вероятно, сработает, так как проверка сертификата не будет выполнена, но она будет открыта для человека в середине атаки.