เพิ่ม TLS หลังจาก Perl เปิดการเชื่อมต่อ SOCKS แล้ว
วาง IO::Socket::SSL ทับบนการเชื่อมต่อ IO::Socket::Socks และตรวจสอบชื่อโฮสต์ปลายทาง
การเชื่อมต่อ 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 เสร็จ