Ανάγνωση πιστοποιητικού ομοτίμου TLS μέσω διαμεσολαβητή HTTP σε Python
Χρησιμοποιήστε την υποστήριξη σήραγγας του HTTPConnection της Python πριν τυλίξετε το socket σε ένα πλαίσιο SSL που επικυρώνει.
Το ssl.get_server_certificate δεν διαπραγματεύεται διαμεσολαβητή HTTP. Δημιουργήστε πρώτα τη σήραγγα και μετά εκτελέστε TLS με το όνομα κεντρικού υπολογιστή προορισμού και λάβετε το πιστοποιητικό ομοτίμου.
Για διαμεσολαβητή HTTP χωρίς έλεγχο ταυτότητας, χρησιμοποιώντας το host και τη θύρα ενός υποψηφίου από τη λίστα διαμεσολαβητών 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 χειρίζεται το αίτημα CONNECT και την απάντησή του. Στη συνέχεια το πλαίσιο SSL επαληθεύει την αλυσίδα και την ταυτότητα του προορισμού πριν επιστραφεί το πιστοποιητικό. Δεν απαιτείται HTTP GET προς τον προορισμό για αυτή τη χειραψία.
Αν το περιβάλλον χρησιμοποιεί εγκεκριμένη ιδιωτική CA, φορτώστε αυτή την CA στο πλαίσιο αντί να απενεργοποιήσετε την επαλήθευση. Μια απορριφθείσα αλυσίδα κάνει τη χειραψία που φαίνεται να αποτυγχάνει.
Το getpeercert επιστρέφει το φυλλικό πιστοποιητικό του ομοτίμου, όχι μια πλήρη αλυσίδα που εξάγεται αυτόματα. Με έμπιστη παρεμβολή TLS, το πιστοποιητικό ομοτίμου μπορεί να είναι το πιστοποιητικό που δημιούργησε ο μεσάζων για αυτό το όνομα κεντρικού υπολογιστή. Διατηρήστε αυτή τη διάκριση όταν το συγκρίνετε με πιστοποιητικό που παρατηρήθηκε μέσω άλλης διαδρομής.