【问题标题】:WWW::Mechanize ignore SSLWWW::Mechanize 忽略 SSL
【发布时间】:2018-04-21 08:29:41
【问题描述】:

我正在使用以下代码,带有以下 sn-p:

我的 $mech = WWW::Mechanize->new('ssl_opts' => { 'verify_hostname' => 0 });

仍然抛出以下错误:

错误 GETing 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);

【问题讨论】:

    标签: perl ssl www-mechanize


    【解决方案1】:

    我想忽略 SSL 握手。

    SSL 握手不能被 https 忽略,因为它是 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 运行时的输出中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-25
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多