Как заставить LWP использовать Crypt :: SSLeay для HTTPS-запросов? - PullRequest
7 голосов
/ 06 ноября 2011

Мой симптом в том, что я не могу использовать прокси с HTTPS-запросами с LWP. Кажется, это общая проблема, и намеки на Google и даже здесь предлагают обходной путь для установки переменной среды HTTPS_PROXY для использования Crypt :: SSLeay.

Моя конкретная проблема заключается в том, что 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;

И это вывод, показывающий, что Crypt :: 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.

Ответы [ 2 ]

9 голосов
/ 06 ноября 2011

Попробуйте это:

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 голос
/ 02 февраля 2012

Это то, что я сделал, чтобы LWP и SOAP :: Lite работали с нашим прокси в GE.Это было после долгих копаний на CPAN, google и т. Д. Я, наконец, понял это после запуска тестового скрипта в пакете 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;
...