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

标签 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

任何帮助都会很棒!

最佳答案

请确保您至少使用 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,您仍将拥有 LWP::Protocol::https 的 6.04 版,但这已经包含了适当的 https 代理支持所需的补丁。

另一种选择是为 LWP 使用旧的 Net::SSL/Crypt::SSLeay 后端,但我建议不要这样做,因为它没有实现所有必要的证书检查,因此会安装一个中间人-中路攻击很容易。

关于perl - 我无法使用 LWP::UserAgent 连接到任何 HTTPS 站点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24700260/

相关文章:

java - 如何在 GlassFish 中启用可选的客户端证书请求?

ssl - 确定 AIX 上配置的 TLS 版本

c++ - 为游戏数据流量添加 SSL 加密是否值得?

web-services - 在 Delphi Web 服务中使用 OpenSSL - 可用协议(protocol)和密码

asp.net - 为什么我可以在代理服务器上看到通过 HTTPS 发送的登录凭据?

切换到 HTTPS 后 Facebook 份额丢失

regex - Perl 正则表达式将 {a, b, c, ..., x} 转换为 (a|b|c|...|x)

Perl Image::Magick 获取内存中的内容

javascript - 为什么我的 mod_perl 应用程序中的 UTF8 数据在 Web 浏览器中仍然出现乱码?

perl - 为什么打印时哈希键的顺序不同?