ssl.get_server_certificate არ აწარმოებს მოლაპარაკებას HTTP პროქსისთან. ჯერ ააგეთ გვირაბი, შემდეგ შეასრულეთ TLS დანიშნულების ჰოსტის სახელით და მიიღეთ პარტნიორის სერტიფიკატი.

ავთენტიფიკაციის გარეშე HTTP პროქსისთვის, 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 ჩარევისას პარტნიორის სერტიფიკატი შეიძლება იყოს შუამავლის მიერ ამ ჰოსტის სახელისთვის შექმნილი სერტიფიკატი. შეინარჩუნეთ ეს განსხვავება, როცა ადარებთ მას სხვა მარშრუტით დაკვირვებულ სერტიფიკატს.

დაკავშირებული სტატიები