Python ਵਿੱਚ HTTP ਪ੍ਰੌਕਸੀ ਰਾਹੀਂ TLS ਪੀਅਰ ਸਰਟੀਫਿਕੇਟ ਪੜ੍ਹੋ
ਸਾਕਟ ਨੂੰ ਜਾਂਚ ਕਰਨ ਵਾਲੇ SSL ਸੰਦਰਭ ਵਿੱਚ ਲਪੇਟਣ ਤੋਂ ਪਹਿਲਾਂ Python ਦੇ HTTPConnection ਟਨਲ ਸਮਰਥਨ ਦੀ ਵਰਤੋਂ ਕਰੋ।
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 ਰੋਕ ਨਾਲ, ਪੀਅਰ ਸਰਟੀਫਿਕੇਟ ਇਸ ਹੋਸਟਨਾਮ ਲਈ ਵਿਚੋਲੇ ਦੁਆਰਾ ਬਣਾਇਆ ਸਰਟੀਫਿਕੇਟ ਹੋ ਸਕਦਾ ਹੈ। ਕਿਸੇ ਹੋਰ ਰਸਤੇ ਦੇਖੇ ਸਰਟੀਫਿਕੇਟ ਨਾਲ ਤੁਲਨਾ ਕਰਦੇ ਸਮੇਂ ਉਹ ਫ਼ਰਕ ਬਣਾਈ ਰੱਖੋ।