Проблема при доступе к хостам с использованием Python запросов через HTTPS через их IP - PullRequest
0 голосов
/ 30 марта 2020

В настоящее время я сталкиваюсь со странной проблемой при попытке получить доступ к серверу через Python Запросы:

Этот сервер использует сертификат, сгенерированный ЦС, а клиент использует сертификат, подписанный этим же ЦС. CA подписан самоподписанным root CA. При доступе к серверу с использованием такого имени хоста, как этот

requests.get("https://example.com/", verify="root.pem", timeout=3)

, он работает без каких-либо проблем. Когда тот же код выполняется на сервере, который доступен только через IP-адрес publi c, а также имеет сертификат с общим именем и альтернативным именем субъекта, установленным на этот IP-адрес, этот код завершается ошибкой с сообщением об ошибке

requests.get("https://<IP>/", verify="root.pem", timeout=3)

requests.exceptions.SSLError: HTTPSConnectionPool(host='<IP>', port=443): Max retries exceeded with url: /test/ (Caused by SSLError(SSLCertVerificationError("hostname '<IP>' doesn't match '<IP>'")))

, хотя, например, OpenSSL s_client не сообщает об ошибках при подключении.

В сети Я не смог найти никого другого, кто бы сообщал или решал эту проблему, если не были задействованы имена хостов, а были только простые IP-адреса. Сами сертификаты также не являются предметом обсуждения, так как их проверка друг на друга не приводит к ошибкам. Особенно меня смущает сообщение об ошибке, так как IP-адреса явно совпадают.

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

Я на самом деле нашел ошибку сейчас, она возникла из-за неправильных предположений, что IP-адрес также должен быть задокументирован в сертификате с использованием расширения имени DNS. Я не знал, что для таких целей доступно расширение IP-адреса. Использование этого решило проблему для меня.

0 голосов
/ 30 марта 2020

Python совершенно верно. Домен, указанный в URL, должен соответствовать теме (ам) сертификата. Если вы хотите вызвать его по IP, тогда IP должен быть одним из субъектов сертификата (то есть альтернативных имен субъектов).

... даже если, например, OpenSSL s_client не сообщает об ошибках При подключении this

Verify return code: 62 (Hostname mismatch)

Обратите внимание, что также очень распространено наличие нескольких доменов на одном IP-адресе с разными сертификатами. И что контент, обслуживаемый этими доменами, может отличаться друг от друга. И этот контент, обслуживаемый самим IP без определенного домена c, может снова быть другим. Таким образом, ожидать, что IP и домен могут просто использоваться поочередно и означать одно и то же, - неверное ожидание.

...