Pridėkite TLS po to, kai Perl atidarė SOCKS ryšį
Uždėkite IO::Socket::SSL ant IO::Socket::Socks ryšio ir patikrinkite paskirties hosto vardą.
SOCKS ryšys ir TLS ryšys atlieka skirtingus darbus. Pirmiausia gaukite baitų srautą iki paskirties per SOCKS. Tada pradėkite TLS ant to srauto, identifikuodami paskirties svetainę, o ne tarpinį serverį.
HTTPS tipo TLS galiniam taškui išdėstymas gali būti toks:
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();
Viešam HTTPS tikslui leistiname viešo tarpinio serverio maršrute SOCKS5 tarpinių serverių sąrašas siūlo kandidatus ProxyAddr ir ProxyPort reikšmėms. Šis fragmentas sukuria transporto sluoksnius; programa vis tiek turi išsiųsti paskirties laukiamą protokolą ir baigusi uždaryti lizdą.
Išsaugokite numatytą partnerio vardą
Tarpinio serverio galinis taškas priklauso pirmajam ryšiui. TLS SNI ir hosto vardo tikrinimas susiję su example.com. Tarpinio serverio hosto vardo naudojimas tame etape gali pareikalauti arba patikrinti neteisingą tapatybę.
Pasitikėjimo saugyklos konfigūracija yra dar vienas nepriklausomas reikalavimas. Naudokite programos numatytą CA konfigūraciją, o ne viskuo pasitikintį atgalinį iškvietimą, nukopijuotą iš diagnostikos pavyzdžio.
Jei SOCKS žingsnis nepavyksta, TLS parametrų keitimas to neištaisys. Jei SOCKS pavyksta, o TLS nepavyksta, išsaugokite sertifikato ir hosto vardo klaidą kaip įrodymą, o ne traktuokite ją kaip bendrą tarpinio serverio sutrikimą.
Modulių pavadinimai taip pat svarbūs: IO::Socket::Socks ir IO::Socket::SSL siūlo skirtingus konstruktorius ir atnaujinimo elgseną. Neapdorotas TCP lizdas, kuris tik pasiekė tarpinį serverį, dar nebaigė SOCKS paskirties derybų.