Мой пример кода:PyOpenSSL получить сертификат сервера от SNI хоста с неизвестными именами хостов
import OpenSSL
import socket
ctx = OpenSSL.SSL.Context(OpenSSL.SSL.SSLv23_METHOD)
s = socket.socket(AF_INET, SOCK_STREAM)
connection = OpenSSL.SSL.Connection(ctx, s)
connection.connect((str(ip), port))
connection.setblocking(1)
connection.do_handshake()
chain = connection.get_peer_cert_chain()
Дело в том, что если узел имеет расширение SNI я получаю сообщение об ошибке:
[('SSL routines', 'SSL3_READ_BYTES', 'sslv3 alert handshake failure')]
Я считаю, что я могу преодолеть это с помощью OpenSSL.SSL.Connection.set_tlsext_host_name(name)
, но для имени пользователя неизвестно, и я хотел бы подключиться к любому доступному имени хоста.
Итак, мой вопрос: есть ли способ подключиться к хосту с помощью ip и получить все доступные имена хостов, которые предоставляют сертификаты? Или есть способ просто получить все сертификаты с хоста SNI?
Использовать ' s_client' для получения сертификата по IP-адресу и печати имен DNS в сертификате: 'openssl s_client -connect: -tls1 -servername | openssl x509 -text -noout'. Используйте IP-адрес в качестве имени сервера SNI. Затем подключитесь к DNS-имени. В размещенной среде с виртуальными серверами это, вероятно, не будет работать должным образом. Возможно, вам придется выполнить обратный поиск DNS для получения имен. Обратный поиск предполагает, что DNS настроен так, как ожидалось, что может и не быть. –
jww