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 таслан саатуулалтын үед хосын гэрчилгээ нь зуучлагчийн энэ хост нэрэнд зориулж үүсгэсэн гэрчилгээ байж болно. Үүнийг өөр замаар ажигласан гэрчилгээтэй харьцуулахдаа энэ ялгааг хадгална уу.

Холбоотой нийтлэлүүд