2011-11-06 10 views
7

Il mio sintomo è che non posso usare un proxy con richieste HTTPS con LWP. Questo sembra essere un problema comune, e i suggerimenti su Google e anche su here suggeriscono tutti un rimedio per l'impostazione della variabile di ambiente HTTPS_PROXY per l'uso da Crypt :: SSLeay.Come impongo a LWP di utilizzare Crypt :: SSLeay per le richieste HTTPS?

Il mio problema specifico sembra essere che LWP :: Protocol :: https sta caricando IO :: Socket :: SSL piuttosto che Crypt :: SSLeay. Come posso forzare l'uso di Crypt :: SSLeay?

Il mio codice:

#!/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; 

Ed è uscita, dimostrando che Crypt :: SSLeay non viene utilizzato:

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 

La semplice aggiunta di un esplicito use Crypt::SSLeay per il mio script è dimostrato inefficace. Carica il modulo, ma continua a caricare IO :: Socket :: SSL e lo usa per le richieste HTTPS.

risposta

9

Prova questo:

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; 

Non ho un proxy adatto, così non ho provato io stesso.

+1

Perfetto, grazie! In questo modo è stato rilevato il probabile motivo per cui LWP imposta automaticamente IO :: Socket :: SSL, come si è verificato nella [propria domanda] (http://stackoverflow.com/questions/74358/how-can-i-get- lwp-to-validate-ssl-server-certificates): 'Net :: SSL da Crypt-SSLeay non può verificare nomi host; Installa IO :: Socket :: SSL o disattiva la verifica impostando la variabile d'ambiente PERL_LWP_SSL_VERIFY_HOSTNAME su 0' – Flimzy

+1

LWP 6 ha cambiato la sua politica sulla convalida dei nomi host. Se puoi, usa qualcosa di diverso da Crypt :: SSLeay, che non ha uno sviluppatore dedicato (anche se Sinan lo ha aiutato a compilare). –

+0

@briandfoy: Se riesco a capire come usare IO :: Socket :: SSL (o un'altra opzione - ci sono altre opzioni?) Con un proxy, lo farò. – Flimzy

1

Questo è quello che ho fatto per far funzionare LWP e SOAP :: Lite con il nostro proxy presso GE. Questo è stato dopo molto scavare su CPAN, google ecc. Alla fine ho capito dopo aver eseguito lo script di test nel pacchetto Crypt :: SSLeay chiamato net_ssl_test ed è stato in grado di connettersi attraverso il proxy. La chiave sta forzando Crypt :: SSLeay ad usare Net :: SSL come menzionato sopra. Tuttavia, questo non è documentato molto bene su 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; 
Problemi correlati