Η σύνδεση SOCKS και η σύνδεση TLS έχουν διαφορετικές δουλειές. Πρώτα αποκτήστε μια ροή bytes προς τον προορισμό μέσω 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. Το απόσπασμα στήνει τα επίπεδα μεταφοράς· η εφαρμογή πρέπει ακόμη να στείλει το πρωτόκολλο που περιμένει ο προορισμός και να κλείσει το socket όταν τελειώσει.

Διατηρήστε το επιδιωκόμενο όνομα ομοτίμου

Το τελικό σημείο του διαμεσολαβητή ανήκει στην πρώτη σύνδεση. Το TLS SNI και η επαλήθευση ονόματος κεντρικού υπολογιστή αφορούν το example.com. Η χρήση του ονόματος του διαμεσολαβητή σε εκείνο το στάδιο μπορεί να ζητήσει ή να επαληθεύσει λάθος ταυτότητα.

Η διαμόρφωση του χώρου αποθήκευσης εμπιστοσύνης είναι άλλη μια ανεξάρτητη απαίτηση. Χρησιμοποιήστε τη διαμόρφωση CA που προορίζει η εφαρμογή αντί για μια συνάρτηση επιστροφής που εμπιστεύεται τα πάντα, αντιγραμμένη από διαγνωστικό παράδειγμα.

Αν το βήμα SOCKS αποτύχει, η αλλαγή παραμέτρων TLS δεν θα το διορθώσει. Αν το SOCKS πετύχει και το TLS αποτύχει, κρατήστε το σφάλμα πιστοποιητικού και ονόματος κεντρικού υπολογιστή ως στοιχείο αντί να το αντιμετωπίσετε ως γενική διακοπή του διαμεσολαβητή.

Τα ονόματα των μονάδων έχουν επίσης σημασία: το IO::Socket::Socks και το IO::Socket::SSL εκθέτουν διαφορετικούς κατασκευαστές και συμπεριφορά αναβάθμισης. Ένα ακατέργαστο socket TCP που μόλις έφτασε στον διαμεσολαβητή δεν έχει ολοκληρώσει ακόμη τη διαπραγμάτευση προορισμού SOCKS.

Σχετικά άρθρα