ອ່ານໃບຢັ້ງຢືນ TLS peer ຜ່ານ HTTP proxy ໃນ Python
ໃຊ້ການສະໜັບສະໜູນອຸໂມງຂອງ HTTPConnection ໃນ Python ກ່ອນທີ່ຈະຫໍ່ socket ດ້ວຍ SSL context ທີ່ກວດສອບ.
ssl.get_server_certificate ບໍ່ໄດ້ເຈລະຈາກັບ HTTP proxy. ສ້າງອຸໂມງກ່ອນ, ແລ້ວເຮັດ TLS ດ້ວຍຊື່ host ປາຍທາງ ແລະ ໄດ້ຮັບໃບຢັ້ງຢືນ peer.
ສຳລັບ HTTP proxy ທີ່ບໍ່ມີການຢັ້ງຢືນ, ໂດຍໃຊ້ host ແລະ port ຂອງຜູ້ສະໝັກຈາກ ລາຍຊື່ HTTP proxy:
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 context ກວດສອບລຳດັບໂສ້ ແລະ ຕົວຕົນຂອງປາຍທາງ ກ່ອນທີ່ໃບຢັ້ງຢືນຈະຖືກສົ່ງຄືນ. ບໍ່ຕ້ອງການ HTTP GET ໄປຫາປາຍທາງສຳລັບການຈັບມືນີ້.
ຖ້າສະພາບແວດລ້ອມໃຊ້ CA ສ່ວນຕົວທີ່ໄດ້ຮັບອະນຸມັດ, ໃຫ້ໂຫຼດ CA ນັ້ນເຂົ້າໃນ context ແທນການປິດການກວດສອບ. ໂສ້ທີ່ຖືກປະຕິເສດເຮັດໃຫ້ການຈັບມືທີ່ສະແດງລົ້ມເຫຼວ.
getpeercert ສົ່ງຄືນໃບຢັ້ງຢືນໃບຂອງ peer, ບໍ່ແມ່ນໂສ້ເຕັມທີ່ສົ່ງອອກອັດຕະໂນມັດ. ດ້ວຍການດັກຈັບ TLS ທີ່ເຊື່ອຖືໄດ້, ໃບຢັ້ງຢືນ peer ອາດເປັນໃບຢັ້ງຢືນທີ່ຕົວກາງສ້າງຂຶ້ນສຳລັບຊື່ host ນີ້. ຮັກສາຄວາມແຕກຕ່າງນັ້ນເມື່ອປຽບທຽບກັບໃບຢັ້ງຢືນທີ່ສັງເກດເຫັນຜ່ານເສັ້ນທາງອື່ນ.