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