2011-11-06 28 views
7

Triệu chứng của tôi là tôi không thể sử dụng proxy với các yêu cầu HTTPS bằng LWP. Điều này có vẻ là một vấn đề phổ biến, và các gợi ý trên Google và thậm chí cả here đều đề xuất một công việc xung quanh để thiết lập biến môi trường HTTPS_PROXY để sử dụng bởi Crypt :: SSLeay.Làm cách nào để buộc LWP sử dụng Crypt :: SSLeay cho các yêu cầu HTTPS?

Vấn đề cụ thể của tôi dường như là LWP :: Giao thức :: https đang tải IO :: Socket :: SSL thay vì Crypt :: SSLeay. Làm cách nào để buộc sử dụng Crypt :: SSLeay?

Mã của tôi:

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

Và đó là đầu ra, cho thấy rằng Crypt :: SSLeay không được sử dụng:

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 

Đơn giản chỉ cần thêm một rõ ràng use Crypt::SSLeay để kịch bản của tôi đã được chứng minh hiệu quả. Nó tải mô-đun, nhưng nó vẫn tiếp tục tải IO :: Socket :: SSL và sử dụng nó cho các yêu cầu HTTPS.

Trả lời

9

Hãy thử điều này:

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; 

Tôi không có một proxy thích hợp, vì vậy tôi đã không thử nó bản thân mình.

+1

Hoàn hảo, cảm ơn! Làm điều này cho thấy lý do có khả năng là LWP mặc định là IO :: Socket :: SSL, khi bạn chạm vào [câu hỏi của riêng bạn] (http://stackoverflow.com/questions/74358/how-can-i-get- lwp-to-validate-ssl-server-certificates): 'Net :: SSL từ Crypt-SSLeay không thể xác minh tên máy chủ; hoặc cài đặt IO :: Socket :: SSL hoặc tắt xác minh bằng cách đặt biến môi trường PERL_LWP_SSL_VERIFY_HOSTNAME thành 0' – Flimzy

+1

LWP 6 thay đổi chính sách của nó về xác thực tên máy chủ. Nếu bạn có thể, sử dụng một cái gì đó khác hơn là Crypt :: SSLeay, mà không có một nhà phát triển chuyên dụng (mặc dù Sinan đã giúp nó biên dịch). –

+0

@briandfoy: Nếu tôi có thể tìm ra cách sử dụng IO :: Socket :: SSL (hoặc tùy chọn khác - có các tùy chọn khác không?) Với proxy, tôi sẽ làm điều đó. – Flimzy

1

Đây là những gì tôi đã làm để có được LWP và SOAP :: Lite để làm việc với proxy của chúng tôi tại GE. Điều này đã được sau khi đào nhiều trên CPAN, google vv Tôi cuối cùng đã tìm ra nó sau khi chạy kịch bản thử nghiệm trong gói Crypt :: SSLeay gọi là net_ssl_test và nó đã có thể kết nối thông qua proxy. Điều quan trọng là buộc Crypt :: SSLeay sử dụng Net :: SSL như đã đề cập ở trên. Tuy nhiên, điều này không được viết rõ ràng trên 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; 
Các vấn đề liên quan