2011-11-06 11 views
7

Mój symptom jest taki, że nie mogę używać proxy z żądaniami HTTPS z LWP. Wydaje się, że jest to powszechny problem, a wskazówki na temat Google, a nawet here, sugerują obejście ustawień zmiennej środowiskowej HTTPS_PROXY do użycia przez Crypt :: SSLeay.Jak zmusić LWP do korzystania z Crypt :: SSLeay dla żądań HTTPS?

Mój specyficzny problem polega na tym, że LWP :: Protokół :: https ładuje IO :: Socket :: SSL zamiast Crypt :: SSLeay. Jak mogę wymusić użycie Crypt :: SSLeay?

Mój kod:

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

I to wyjście, pokazując, że Crypt :: SSLeay nie jest używany:

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 

Wystarczy dodanie wyraźnego use Crypt::SSLeay do mojego skryptu okazało się nieskuteczne. Ładuje moduł, ale nadal ładuje IO :: Socket :: SSL i używa go do żądań HTTPS.

Odpowiedz

9

Spróbuj tego:

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; 

nie mam odpowiedniego pełnomocnictwa, więc nie próbowałem to sam.

+1

Doskonale, dzięki! Wywołało to prawdopodobną przyczynę LWP do IO :: Socket :: SSL, o której mowa w [własnym pytaniu] (http://stackoverflow.com/questions/74358/how-can-i-get- lwp-to-validate-ssl-server-certificates): 'Net :: SSL z Crypt-SSLeay nie może zweryfikować nazw hostów; albo zainstaluj IO :: Socket :: SSL lub wyłącz weryfikację, ustawiając zmienną środowiskową PERL_LWP_SSL_VERIFY_HOSTNAME na 0' – Flimzy

+1

LWP 6 zmieniono jej politykę sprawdzania poprawności nazw hosta. Jeśli możesz, użyj czegoś innego niż Crypt :: SSLeay, które nie ma dedykowanego programisty (chociaż Sinan pomagał w jego kompilacji). –

+0

@ briandfoy: Jeśli mogę wymyślić jak używać IO :: Socket :: SSL (lub innej opcji - czy są inne opcje?) Z proxy, zrobię to. – Flimzy

1

To właśnie zrobiłem, aby uzyskać LWP i SOAP :: Lite do współpracy z naszym proxy w GE. To było po wielu kopaniu na CPAN, google itd. W końcu zorientowałem się, po uruchomieniu skryptu testowego w pakiecie Crypt :: SSLeay o nazwie net_ssl_test i udało mu się połączyć przez proxy. Kluczem jest zmuszenie Crypt :: SSLeay do korzystania z Net :: SSL, jak wspomniano powyżej. Nie jest to jednak udokumentowane w 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; 
Powiązane problemy