我无法使用LWP :: UserAgent连接到任何HTTPS站点

时间:2014-07-11 14:35:41

标签: perl ssl https lwp lwp-useragent

我正在尝试创建一个只是连接到网站的脚本。但是,由于某种原因,它不会连接到任何使用HTTPS的东西。

我们在此处启用了代理。但是,我认为代理不是问题,因为如果我连接到网络内部没有隧道通过代理的HTTPS,它仍然会失败。

如果我要在任何不使用HTTPS的网站上运行此程序,我可以通过并且脚本按预期工作。

我想知道的是阻止脚本连接到任何SSL安全站点的可能性。

这是我写的代码:

$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";
}

出于某种原因,HTTPS_DEBUG功能不会输出调试,这使得解决这个问题变得更加困难。

运行脚本时,我收到一般错误:

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

任何帮助都会很棒!

1 个答案:

答案 0 :(得分:7)

请确保您至少使用版本6.06的LWP :: UserAgent和版本6.06的LWP :: Protocol :: https。之前的任何版本都没有对https代理的适当支持,至少在使用IO :: Socket :: SSL作为底层SSL库时是这样。

获取正在运行的版本:

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

如果您使用的内容少于所需的版本升级。虽然这对LWP :: UserAgent来说很容易,但默认情况下cpan可能无法安装最新版本的LWP :: Protocol :: https,请参阅http://www.nntp.perl.org/group/perl.libwww/2014/05/msg7718.html。在这种情况下,您必须从http://search.cpan.org/~mschilli/LWP-Protocol-https-6.06/明确地获取它。

如果您使用的是最近的Debian系统或Ubuntu> = 14.04,您仍然可以使用版本6.04的LWP :: Protocol :: https,但这已经包含了正确的https代理支持所需的补丁。

另一个替代方案是使用旧的Net :: SSL / Crypt :: SSLeay后端用于LWP,但我建议反对它,因为它没有实现所有必要的证书检查,因此安装了一个man-in-the-对它的中间攻击很容易。