2011-11-06 107 views
7

我的症狀是我無法使用帶LWP的HTTPS請求代理。這似乎是一個常見問題,並且Google上的提示,甚至here都提示了設置HTTPS_PROXY環境變量的解決方法,以供Crypt :: SSLeay使用。如何強制LWP使用Crypt :: SSLeay進行HTTPS請求?

我的具體問題似乎是LWP :: Protocol :: https加載IO :: Socket :: SSL而不是Crypt :: SSLeay。 我該如何強制使用Crypt :: SSLeay?

我的代碼:

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

而且它的輸出,顯示出不使用地穴:: SSLeay的:

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 

簡單地增加一個明確的use Crypt::SSLeay到我的劇本已被證明是無效的。它加載模塊,但它繼續加載IO :: Socket :: SSL,並將其用於HTTPS請求。

回答

9

試試這個:

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; 

我沒有合適的代理,所以我還沒有嘗試過自己。

+1

完美,謝謝! 這樣做揭示了LWP默認爲IO :: Socket :: SSL的可能原因,正如你在[自己的問題]中所觸及的(http://stackoverflow.com/questions/74358/how-can-i-get- lwp-to-validate-ssl-server-certificates):來自Crypt-SSLeay的Net :: SSL無法驗證主機名;要麼安裝IO :: Socket :: SSL,要麼通過將PERL_LWP_SSL_VERIFY_HOSTNAME環境變量設置爲0來關閉驗證 – Flimzy

+1

LWP 6在驗證主機名時更改了它的策略。如果可以的話,使用Crypt :: SSLeay以外的東西,它沒有專門的開發人員(儘管Sinan一直在幫助編譯)。 –

+0

@briandfoy:如果我可以通過代理了解如何使用IO :: Socket :: SSL(或其他選項 - 是否有其他選項?),我會這樣做。 – Flimzy

1

這就是我爲了讓LWP和SOAP :: Lite與我們在GE的代理一起工作而做的。這是在CPAN,谷歌等深入挖掘之後,我終於在Crypt :: SSLeay軟件包中運行測試腳本net_ssl_test後發現它,並且它能夠通過代理進行連接。如上所述,關鍵是迫使Crypt :: SSLeay使用Net :: SSL。然而,這在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; 
相關問題