2017-11-08 3 views
1

Ich bin mit dem folgenden Code, mit dem folgenden Ausschnitt:WWW :: Mechanize SSL ignoriert

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

die folgenden Fehler noch geworfen wird:

Fehler Geting https://www.1031exchangeinc.com/: Es kann keine Verbindung zu www.1031exchangeinc.com:443 (SSL verbindet Versuch fehlgeschlagen Fehler: 14077410: SSL-Routinen: SSL23_GET_SERVER_HELLO: SSLv3 Alarm Handshake-Fehler) bei crawl.pl Zeile 29.

Ich möchte den SSL-Handshake ignorieren.

#!/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); 

Antwort

2

I want to ignore the SSL handshake.

Der SSL-Handshake mit https nicht ignoriert werden kann, da sie integraler Bestandteil einer TLS-Verbindung (und damit https) ist. Sie könnten höchstens versuchen, die Validierung des Zertifikats zu überspringen (schlechte Idee), was Sie gerade versuchen. Aber das lässt Handshake-Fehler nicht verschwinden.

Solche Handshake-Fehler werden stattdessen beispielsweise durch nicht überlappende Cipher Suites zwischen Client und Server, nicht unterstützte Protokollversionen oder fehlende, aber erforderliche TLS-Erweiterungen verursacht.

Es ist unklar, was genau das Problem in Ihrem Fall ist. Aber da der Server SNI gemäß the SSLLabs report benötigt und moderne Chiffren (ECDHE und/oder GCM oder ChaCha20) benötigt, ist meine Vermutung, dass Sie eine zu alte Version von OpenSSL verwenden. Dies ist typischerweise bei MacOS X der Fall, der mit einer sehr alten Version von OpenSSL ausgeliefert wird, d. H. Version 0.9.8.

Sie können die Version überprüfen Sie verwenden, um mit

perl -MNet::SSLeay -e 'warn Net::SSLeay::SSLeay_version(0)' 

Wenn dies alles berichtet, wie 0.9.8 dann haben Sie gefunden der Grund, warum es fehlschlägt, und Sie müssen auf eine neuere Version von OpenSSL aktualisieren und rekompilieren Sie Net :: SSLeay dagegen.
Wenn Sie stattdessen zumindest OpenSSL 1.0.1 haben, dann ist es ein anderes Problem und Sie sollten die Versionen von Net :: SSLeay und IO :: Socket :: SSL zu Ihrer Frage hinzufügen und auch die Ausgabe mit perl -MIO::Socket::SSL=debug4 your-program.pl.

Verwandte Themen