我使用以下代码,使用以下代码段:
my mech = WWW :: Mechanize-> new(' ssl_opts' => {' verify_hostname' => 0});
仍然抛出以下错误:
错误获取https://www.1031exchangeinc.com/:无法连接到www.1031exchangeinc.com:443(SSL连接尝试失败错误:14077410:SSL例程:SSL23_GET_SERVER_HELLO:sslv3警报握手失败)在crawl.pl第29行。
我想忽略SSL握手。
#!/usr/bin/perl
use Modern::Perl;
use WWW::Mechanize;
use IO::Socket::SSL;
my $root = 'https://www.1031exchangeinc.com/';
my $domain = 'https://www.1031exchangeinc.com';
#my $mech = WWW::Mechanize->new;
my $mech = WWW::Mechanize->new( 'ssl_opts' => { 'verify_hostname' => 0 } );
sub visit {
my $url = shift;
my $indent = shift || 0;
my $visited = shift || {};
my $tab = ' ' x $indent;
# Already seen that.
return if $visited->{$url}++;
# Leaves domain.
if ($url !~ /^$domain/) {
say $tab, "-> $url";
return;
}
# Not seen yet.
say $tab, "- $url ";
$mech->get($url);
visit($_, $indent+2, $visited) for
map {$_->url_abs} $mech->links;
}
visit($root);
答案 0 :(得分:3)
我想忽略SSL握手。
https不能忽略SSL握手,因为它是TLS连接的一个组成部分(因此也是https)。最多你可以尝试跳过你正在尝试的证书(坏主意)的验证。但是,这并不能使握手失败消失。
此类握手错误反而是由客户端和服务器之间的非重叠密码套件,不支持的协议版本或缺少但需要的TLS扩展引起的。
目前还不清楚你的问题究竟是什么问题。但鉴于服务器需要根据the SSLLabs report的SNI并且它需要现代密码(ECDHE和/或GCM或ChaCha20),我的猜测是你使用的是旧版本的OpenSSL。这通常是MacOS X的情况,它附带一个非常旧版本的OpenSSL,即版本0.9.8。
您可以使用
检查您使用的版本perl -MNet::SSLeay -e 'warn Net::SSLeay::SSLeay_version(0)'
如果报告任何类似0.9.8的内容,那么您已找到原因导致失败的原因,您需要升级到较新版本的OpenSSL并重新编译Net :: SSLeay。
如果您至少拥有OpenSSL 1.0.1,那么这是一个不同的问题,您应该将Net :: SSLeay和IO :: Socket :: SSL的版本添加到您的问题中,并在运行perl -MIO::Socket::SSL=debug4 your-program.pl
时输出。