Чытанне сертыфіката аднарангавага вузла TLS праз HTTP-праксі ў Python
Выкарыстайце падтрымку тунеля HTTPConnection у Python, перш чым абгарнуць сокет у SSL-кантэкст з праверкай.
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 сертыфікат аднарангавага вузла можа быць сертыфікатам, створаным пасярэднікам для гэтага імені хоста. Захоўвайце гэта адрозненне пры параўнанні з сертыфікатам, назіраным праз іншы шлях.