ssl.get_server_certificate nie negocjuje połączenia z proxy HTTP. Najpierw ustanów tunel, potem wykonaj TLS z nazwą hosta docelowego i pobierz certyfikat peera.

Dla proxy HTTP bez uwierzytelniania, używając hosta i portu kandydata z listy proxy HTTP:

from contextlib import closing
import http.client
import ssl

hostname = "example.com"
context = ssl.create_default_context()

with closing(http.client.HTTPConnection(
    "proxy.example.net", 8080, timeout=10
)) as connection:
    connection.set_tunnel(hostname, 443)
    connection.connect()

    with context.wrap_socket(
        connection.sock, server_hostname=hostname
    ) as tls:
        certificate_der = tls.getpeercert(binary_form=True)

certificate_pem = ssl.DER_cert_to_PEM_cert(certificate_der)

HTTPConnection obsługuje żądanie CONNECT i jego odpowiedź. Następnie kontekst SSL weryfikuje łańcuch i tożsamość celu, zanim certyfikat zostanie zwrócony. Do tego uzgadniania nie jest potrzebne żądanie HTTP GET do celu.

Jeśli środowisko używa zatwierdzonego prywatnego CA, wczytaj to CA do kontekstu, zamiast wyłączać weryfikację. Odrzucony łańcuch powoduje niepowodzenie pokazanego uzgadniania.

getpeercert zwraca certyfikat liścia peera, a nie automatycznie wyeksportowany pełny łańcuch. Przy zaufanym przechwytywaniu TLS certyfikat peera może być certyfikatem wygenerowanym przez pośrednika dla tej nazwy hosta. Zachowaj tę różnicę, porównując go z certyfikatem zaobserwowanym inną drogą.

Powiązane artykuły