2011-11-06 12 views
7

Mi síntoma es que no puedo usar un proxy con solicitudes HTTPS con LWP. Esto parece ser un problema común, y las sugerencias en Google e incluso here sugieren una solución alternativa para establecer la variable de entorno HTTPS_PROXY para su uso por Crypt :: SSLeay.¿Cómo obligo a LWP a usar Crypt :: SSLeay para las solicitudes HTTPS?

Mi problema específico parece ser que LWP :: Protocol :: https está cargando IO :: Socket :: SSL en lugar de Crypt :: SSLeay. ¿Cómo puedo forzar el uso de Crypt :: SSLeay en su lugar?

Mi código:

#!/usr/bin/perl 

use strict; 
use warnings; 
$ENV{HTTPS_PROXY} = 'http://10.0.3.1:3128'; 
use LWP::UserAgent; 
my $ua = LWP::UserAgent->new(); 
my $req = HTTP::Request->new('GET','https://www.meritrustcu.org/'); 
my $res = $ua->request($req); 
print "$_\n" for grep { $_ =~ /SSL/ } keys %INC; 

Y es la salida, lo que demuestra que Crypt :: SSLeay no se está utilizando:

Net/SSLeay.pm 
IO/Socket/SSL.pm 
/usr/lib/perl5/auto/Net/SSLeay/autosplit.ix 
/usr/lib/perl5/auto/Net/SSLeay/set_proxy.al 
/usr/lib/perl5/auto/Net/SSLeay/randomize.al 

Simplemente añadiendo una explícita use Crypt::SSLeay a mi guión ha demostrado ser ineficaz. Carga el módulo, pero continúa cargando IO :: Socket :: SSL y lo usa para las solicitudes HTTPS.

Respuesta

9

Prueba esto:

use strict; 
use warnings; 

use Net::SSL(); # From Crypt-SSLeay 
BEGIN { 
    $Net::HTTPS::SSL_SOCKET_CLASS = "Net::SSL"; # Force use of Net::SSL 
    $ENV{HTTPS_PROXY} = 'http://10.0.3.1:3128'; 
} 

use LWP::UserAgent; 
my $ua = LWP::UserAgent->new(); 
my $req = HTTP::Request->new('GET','https://www.meritrustcu.org/'); 
my $res = $ua->request($req); 
print "$_\n" for grep { $_ =~ /SSL/ } keys %INC; 

no tengo un proxy adecuado, así que no he probado a mí mismo.

+1

Perfecto, gracias! Al hacerlo, se reveló la razón probable por la que LWP se establece de manera predeterminada en IO :: Socket :: SSL, tal como lo mencionó en su [propia pregunta] (http://stackoverflow.com/questions/74358/how-can-i-get- lwp-to-validate-ssl-server-certificates): 'Net :: SSL de Crypt-SSLeay no puede verificar nombres de host; instale IO :: Socket :: SSL o desactive la verificación estableciendo la variable de entorno PERL_LWP_SSL_VERIFY_HOSTNAME en 0' – Flimzy

+1

LWP 6 cambió su política de validación de nombres de host. Si puede, use algo que no sea Crypt :: SSLeay, que no tiene un desarrollador dedicado (aunque Sinan lo ha estado ayudando a compilar). –

+0

@briandfoy: Si puedo averiguar cómo usar IO :: Socket :: SSL (u otra opción, ¿hay otras opciones?) Con un proxy, lo haré. – Flimzy

1

Esto es lo que hice para que LWP y SOAP :: Lite trabajen con nuestro proxy en GE. Esto fue después de excavar mucho en CPAN, google etc. Finalmente lo descubrí después de ejecutar el script de prueba en el paquete Crypt :: SSLeay llamado net_ssl_test y se pudo conectar a través del proxy. La clave es forzar a Crypt :: SSLeay a usar Net :: SSL como se mencionó anteriormente. Sin embargo, esto no está documentado muy bien en CPAN.

use LWP::UserAgent; 

# override HTTPS setting in LWP to work with a proxy 
$ENV{PERL_NET_HTTPS_SSL_SOCKET_CLASS} = "Net::SSL"; 
$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0; 
$ENV{HTTPS_PROXY}    = 'http-proxy.ae.ge.com:80'; 
$ENV{HTTPS_PROXY_USERNAME}  = 'username'; 
$ENV{HTTPS_PROXY_PASSWORD}  = 'password'; 

$ua = new LWP::UserAgent; 

# make a https request 
my $req = HTTP::Request->new(GET => 'https://mail.google.com/'); 
my $res = $ua->request($req); 
print $res->as_string; 
Cuestiones relacionadas