Kết nối SOCKS và kết nối TLS có nhiệm vụ khác nhau. Trước tiên hãy lấy một luồng byte đến đích qua SOCKS. Sau đó khởi động TLS trên luồng đó, xác định trang web đích chứ không phải proxy.

Với một điểm cuối TLS kiểu HTTPS, cách bố trí có thể là:

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();

Với một mục tiêu HTTPS công khai trên tuyến proxy công khai được phép, danh sách proxy SOCKS5 cung cấp các ứng viên cho ProxyAddr và ProxyPort. Đoạn này thiết lập các tầng truyền tải; ứng dụng vẫn phải gửi giao thức mà đích mong đợi và đóng socket khi hoàn tất.

Giữ nguyên tên đối tác dự định

Điểm cuối của proxy thuộc về kết nối đầu tiên. TLS SNI và việc xác minh tên máy chủ liên quan đến example.com. Dùng tên máy chủ của proxy ở giai đoạn đó có thể yêu cầu hoặc xác minh sai danh tính.

Cấu hình kho tin cậy là một yêu cầu độc lập khác. Hãy dùng cấu hình CA mà ứng dụng dự định thay vì một callback tin tưởng mọi thứ được sao chép từ ví dụ chẩn đoán.

Nếu bước SOCKS thất bại, việc thay đổi tham số TLS sẽ không khắc phục được. Nếu SOCKS thành công mà TLS thất bại, hãy giữ lỗi chứng chỉ và tên máy chủ làm bằng chứng thay vì coi đó là sự cố proxy chung.

Tên mô-đun cũng quan trọng: IO::Socket::Socks và IO::Socket::SSL cung cấp hàm khởi tạo và hành vi nâng cấp khác nhau. Một socket TCP thô chỉ mới đến được proxy vẫn chưa hoàn tất thương lượng đích SOCKS.

Bài viết liên quan