Añadir TLS después de que Perl haya abierto la conexión SOCKS
Superponga IO::Socket::SSL sobre una conexión IO::Socket::Socks y verifique el nombre de host de destino.
La conexión SOCKS y la conexión TLS tienen trabajos distintos. Primero obtenga un flujo de bytes hacia el destino mediante SOCKS. Luego inicie TLS sobre ese flujo, identificando el sitio web de destino en lugar del proxy.
Para un extremo TLS de estilo HTTPS, la disposición puede ser:
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();
Para un destino HTTPS público en una ruta de proxy público permitida, la lista de proxies SOCKS5 ofrece candidatos para ProxyAddr y ProxyPort. El fragmento establece las capas de transporte; la aplicación todavía debe enviar el protocolo que espera el destino y cerrar el socket al terminar.
Conserve el nombre de par previsto
El extremo del proxy pertenece a la primera conexión. El SNI de TLS y la verificación del nombre de host se refieren a example.com. Usar el nombre de host del proxy en esa etapa puede solicitar o verificar una identidad equivocada.
La configuración del almacén de confianza es otro requisito independiente. Use la configuración de CA prevista por la aplicación en lugar de una función de devolución que confía en todo, copiada de un ejemplo de diagnóstico.
Si el paso SOCKS falla, cambiar parámetros de TLS no lo arreglará. Si SOCKS tiene éxito y TLS falla, conserve el error de certificado y de nombre de host como evidencia en lugar de tratarlo como una caída genérica del proxy.
Los nombres de los módulos también importan: IO::Socket::Socks e IO::Socket::SSL exponen constructores y comportamiento de actualización distintos. Un socket TCP en bruto que solo llegó al proxy aún no ha completado la negociación de destino SOCKS.