【问题标题】:I cannot Connect to any HTTPS site using LWP::UserAgent我无法使用 LWP::UserAgent 连接到任何 HTTPS 站点
【发布时间】:2014-09-02 05:28:54
【问题描述】:

我正在尝试创建一个仅连接到网站的脚本。但是,由于某种原因,它不会连接到任何使用 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

任何帮助都会很棒!

【问题讨论】:

    标签: perl ssl https lwp lwp-useragent


    【解决方案1】:

    请确保您至少使用 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 代理所需的补丁。

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

    【讨论】:

    • 将 LWP::Protocol::https 升级到 6.06 有效。非常感谢!注意:我确实必须手动安装 6.06,因为 cpan 使用的是 6.04
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    相关资源
    最近更新 更多