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 হস্তক্ষেপে, পিয়ার সার্টিফিকেট এই হোস্টনামের জন্য মধ্যস্থতাকারীর তৈরি সার্টিফিকেট হতে পারে। অন্য পথে দেখা সার্টিফিকেটের সাথে তুলনা করার সময় সেই পার্থক্য বজায় রাখুন।