Альтернатива для get_server_certificate () с настроенным прокси - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь получить сертификат целевого сайта, выполнив вызов ssl.get_server_certificate ().Этот запрос истекает, если прокси-сервер настроен на моем сервере (в противном случае работает нормально).Есть ли способ передать настройки прокси в ssl для получения сертификата целевого сервера?Или есть другая альтернатива, чтобы получить сертификат целевого веб-сайта, который учитывает настройки прокси.

Кроме того, целевой сайт постоянно меняется, поэтому нельзя добавлять их в правило брандмауэра, чтобы избежать тайм-аута.

self.host = 'target-website.com'
self.port = 443
PROXY = (''proxy_ip_addr', 3128)
current_cert = ssl.get_server_certificate((self.host, self.port),
                                              ssl_version=ssl.PROTOCOL_TLSv1)

1 Ответ

0 голосов
/ 03 декабря 2018

get_server_certificate не поддерживает прокси.Но с некоторым кодом вы можете просто создать туннель через прокси с помощью HTTP-запроса CONNECT, обновить туннель до SSL и затем получить сертификат:

import socket
import ssl

host  = ('target.example.com',443)
proxy = (proxy_ip,proxy_port)

# connect to proxy
s = socket.socket()
s.connect(proxy)

# create tunnel to target
s.send("CONNECT {}:{} HTTP/1.0\r\n\r\n".format(*host))
buf = s.recv(8192)
assert(buf[9:12] == '200') # HTTP/1.1 200 ...

# upgrade socket to ssl - ignore certifcate errors since we only want
# to get the certificate and don't transfer sensitive data
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
cert = ctx.wrap_socket(s, server_hostname = host[0]).getpeercert(True)
print(ssl.DER_cert_to_PEM_cert(cert))
...