การเชื่อมต่อ SOCKS และการเชื่อมต่อ TLS มีหน้าที่ต่างกัน ขั้นแรกให้ได้สตรีมไบต์ไปยังปลายทางผ่าน SOCKS จากนั้นเริ่ม TLS บนสตรีมนั้น โดยระบุเว็บไซต์ปลายทางไม่ใช่พร็อกซี

สำหรับปลายทาง TLS แบบ HTTPS การจัดวางอาจเป็นดังนี้

use IO::Socket::Socks;
use IO::Socket::SSL;

my $target = 'example.com';
my $socket = IO::Socket::Socks->new(
    SocksVersion => 5,
    ProxyAddr => '127.0.0.1',
    ProxyPort => 1080,
    ConnectAddr => $target,
    ConnectPort => 443,
) or die $!;

IO::Socket::SSL->start_SSL(
    $socket,
    SSL_hostname => $target,
    SSL_verifycn_name => $target,
    SSL_verifycn_scheme => 'http',
    SSL_verify_mode => SSL_VERIFY_PEER,
) or die IO::Socket::SSL::errstr();

สำหรับเป้าหมาย HTTPS สาธารณะบนเส้นทางพร็อกซีสาธารณะที่ได้รับอนุญาต รายการพร็อกซี SOCKS5 มีผู้สมัครสำหรับ ProxyAddr และ ProxyPort ส่วนนี้สร้างชั้นการรับส่งข้อมูล แอปพลิเคชันยังต้องส่งโปรโตคอลที่ปลายทางคาดหวังและปิดซ็อกเก็ตเมื่อเสร็จ

รักษาชื่อเพียร์ที่ตั้งใจไว้

ปลายทางของพร็อกซีเป็นของการเชื่อมต่อแรก TLS SNI และการตรวจสอบชื่อโฮสต์เกี่ยวข้องกับ example.com การใช้ชื่อโฮสต์ของพร็อกซีในขั้นนั้นอาจร้องขอหรือตรวจสอบตัวตนที่ผิด

การกำหนดค่าที่เก็บความเชื่อถือเป็นข้อกำหนดอิสระอีกข้อ ใช้การกำหนดค่า CA ที่แอปพลิเคชันตั้งใจไว้แทน callback ที่เชื่อถือทุกอย่างซึ่งคัดลอกมาจากตัวอย่างการวินิจฉัย

หากขั้นตอน SOCKS ล้มเหลว การเปลี่ยนพารามิเตอร์ TLS จะไม่แก้ไข หาก SOCKS สำเร็จและ TLS ล้มเหลว ให้เก็บ ข้อผิดพลาดของใบรับรองและชื่อโฮสต์ ไว้เป็นหลักฐานแทนที่จะถือว่าเป็นพร็อกซีขัดข้องทั่วไป

ชื่อโมดูลก็สำคัญเช่นกัน IO::Socket::Socks และ IO::Socket::SSL มีคอนสตรักเตอร์และพฤติกรรมการอัปเกรดที่ต่างกัน ซ็อกเก็ต TCP ดิบที่เพียงไปถึงพร็อกซียังไม่ได้เจรจาปลายทาง SOCKS เสร็จ

บทความที่เกี่ยวข้อง