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

Из документации wrap_socket:

Если значение этого параметра не CERT_NONE, то параметр ca_certs должен указывать на файл сертификатов CA.

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

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

Другие вопросы по тегам