8

我的症状是我无法使用带有 LWP 的 HTTPS 请求的代理。这似乎是一个常见问题,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 请求。

4

2 回答 2

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;

我没有合适的代理,所以我自己没有尝试过。

于 2011-11-06T11:06:28.407 回答
1

这就是我为使 LWP 和 SOAP::Lite 与我们在 GE 的代理一起工作所做的工作。这是在对 CPAN、google 等进行大量挖掘之后。我在运行名为 net_ssl_test 的 Crypt::SSLeay 包中的测试脚本后终于弄明白了,它能够通过代理进行连接。如上所述,关键是强制 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;
于 2012-02-02T18:43:36.940 回答