WWW :: Mechanize忽略SSL

时间:2017-11-08 15:17:39

标签: perl ssl www-mechanize

我使用以下代码,使用以下代码段:

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);

1 个答案:

答案 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时输出。