2014-07-11 16 views
5

Tôi đang cố tạo một tập lệnh đơn giản chỉ cần kết nối với một trang web. Tuy nhiên, vì lý do nào đó, nó sẽ không kết nối với bất kỳ thứ gì đang sử dụng HTTPS.Tôi không thể Kết nối với bất kỳ trang web HTTPS nào bằng LWP :: UserAgent

Chúng tôi đã bật proxy ở đây. Tuy nhiên, tôi tin rằng proxy không phải là vấn đề, bởi vì nếu tôi đã kết nối với một HTTPS bên trong mạng mà không đường hầm thông qua một proxy nó vẫn không thành công.

Nếu tôi chạy chương trình này trên bất kỳ trang web nào không sử dụng HTTPS, tôi có thể hoàn thành và tập lệnh hoạt động như dự định.

Điều tôi đang tự hỏi là điều gì có thể thực hiện bằng cách chặn tập lệnh kết nối với bất kỳ trang web bảo mật SSL nào.

Dưới đây là đoạn code mà tôi đã viết:

$ENV{HTTPS_DEBUG} = 1; 

my $ua = LWP::UserAgent->new(keep_alive => 1); 
$ua->agent('Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1916.153 Safari/537.36'); 
my $pac = HTTP::ProxyPAC->new(URI->new("http://pacfilelocation:8080/pac_file.pac")); 
my $res = $pac->find_proxy("https://www.google.com"); 


if ($res->direct) { 
    print "No Proxy Needed\n"; 
} elsif ($res->proxy) { 
    print "Proxy: " . $res->proxy . "\n"; 
    $ENV{HTTPS_PROXY} = $res->proxy; 
    $ENV{HTTP_PROXY} = $res->proxy; 
    $ua->env_proxy; 
} 

my $req = new HTTP::Request('GET', 'https://www.google.com/'); 
$req->header('Accept' => 'text/html'); 
$req->header('Host', 'www.google.com'); 

my $res2 = $ua->request($req); 

if ($res2->is_success) { 
    print $res2->decoded_content; 
} else { 
    print "Error: " . $res2->status_line . "\n"; 
} 

Tính năng HTTPS_DEBUG vì một lý do không ra gỡ lỗi, mà làm này tất cả các khó khăn hơn để giải quyết.

Khi chạy kịch bản tôi nhận được một lỗi chung chung:

Error: 500 Can't connect to www.google.com:443 

Bất kỳ trợ giúp sẽ là tuyệt vời!

Trả lời

7

Hãy đảm bảo rằng bạn sử dụng ít nhất phiên bản 6.06 của LWP :: UserAgent và phiên bản 6.06 của LWP :: Protocol :: https. Bất kỳ phiên bản nào trước đây không có hỗ trợ thích hợp cho proxy https, ít nhất là không sử dụng IO :: Socket :: SSL làm thư viện SSL cơ bản.

Để có được phiên bản bạn đang chạy:

use LWP::UserAgent; 
use LWP::Protocol::https; 
print "LWP::UserAgent: ".LWP::UserAgent->VERSION,"\n"; 
print "LWP::Protocol::https: ".LWP::Protocol::https->VERSION,"\n"; 

Nếu bạn sử dụng bất cứ điều gì ít hơn so với các phiên bản cần nâng cấp. Mặc dù điều này rất dễ dàng cho LWP :: UserAgent, cpan có thể không cài đặt phiên bản LWP :: Protocol :: https mới nhất theo mặc định, xem http://www.nntp.perl.org/group/perl.libwww/2014/05/msg7718.html. Trong trường hợp này, bạn phải nhận rõ ràng từ http://search.cpan.org/~mschilli/LWP-Protocol-https-6.06/.

Nếu bạn đang sử dụng hệ thống Debian gần đây hoặc Ubuntu> = 14.04, bạn vẫn sẽ có phiên bản 6.04 của LWP :: Protocol :: https, nhưng điều này bao gồm các bản vá cần thiết để hỗ trợ proxy https thích hợp.

Một giải pháp thay thế khác là sử dụng phụ trợ Net :: SSL/Crypt :: SSLeay cũ cho LWP, nhưng tôi khuyên bạn không nên dùng nó vì nó không thực hiện tất cả các kiểm tra chứng chỉ cần thiết và -middle tấn công chống lại nó rất dễ dàng.

+1

Nâng cấp LWP :: Giao thức :: https đến 6.06 đã hoạt động. Cám ơn rất nhiều! Lưu ý: Tôi đã phải tự cài đặt 6.06, như cpan sử dụng 6.04 – theEli

Các vấn đề liên quan