Bugfix IO::Socket::SSL 1.56 must be installed for https support

In der Programmiersprache Perl gibt es mehrere Bibliotheken mit denen Sie laden Sie die Daten aus dem Internet über HTTP. Sama bekannt ist LWP und HTTP::Tiny. Bibliothek HTTP::Tiny kommt zusammen mit Perl, es muss nicht zusätzlich installieren, daher ist es oft bequem Daten von Ihrer Hilfe.

Erfolgreiche Download HTML Seiten über http

Das folgende Beispiel lädt die Startseite der Website http://example.com. In diesem Beispiel verwendet http und nicht https:

#!/usr/bin/perl

use strict;
use warnings;
use feature qw(say);

use HTTP::Tiny;
use Data::Dumper;

my $response = HTTP::Tiny->new()->get('http://example.com');

warn Dumper $response;

Wenn Sie diesen Code ausführen, werden Sie sehen, dass alles funktioniert. Status 200. Das Feld successWert ist die Wahrheit (in diesem Text zur Vereinfachung der Darstellung der Datenstruktur für das Feld content wurde geändert Wert, anstelle des html-Codes der Seiten sind drei Punkte):

$ perl script.pl
$VAR1 = {
          'reason' => 'OK',
          'protocol' => 'HTTP/1.1',
          'content' => '...',
          'headers' => {
                         'etag' => '"3147526947+gzip+ident"',
                         'x-cache' => 'HIT',
                         'connection' => 'close',
                         'cache-control' => 'max-age=604800',
                         'content-length' => '1256',
                         'server' => 'ECS (nyb/1D2A)',
                         'expires' => 'Mon, 30 Dec 2019 12:38:04 GMT',
                         'vary' => 'Accept-Encoding',
                         'content-type' => 'text/html; charset=UTF-8',
                         'date' => 'Mon, 23 Dec 2019 12:38:04 GMT',
                         'last-modified' => 'Thu, 17 Oct 2019 07:18:26 GMT'
                       },
          'url' => 'http://example.com',
          'success' => 1,
          'status' => '200'
        };

Fehler bei der Verwendung des https-Protokolls

Aber wenn ein wenig ändern diesen Code und laden Sie die Daten über https, dann Daten werden nicht geladen. Hier ist der Code des Programms:

#!/usr/bin/perl

use strict;
use warnings;
use feature qw(say);

use HTTP::Tiny;
use Data::Dumper;

my $response = HTTP::Tiny->new()->get('https://example.com');

warn Dumper $response;

Das ist das Ergebnis der Arbeit des Programms:

$ perl script.pl
$VAR1 = {
          'url' => 'https://example.com',
          'reason' => 'Internal Exception',
          'status' => 599,
          'success' => '',
          'headers' => {
                         'content-type' => 'text/plain',
                         'content-length' => 57
                       },
          'content' => 'IO::Socket::SSL 1.56 must be installed for https support
'
        };

Der Wert des Feldes status 599 (dies ist ein spezieller Status in der Bibliothek geprägt HTTP::Tiny, es bedeutet, dass das Problem mit der Bibliothek). Wert success ist falsch, und im Feld content gibt es eine Erklärung weshalb der Fehler aufgetreten ist: IO::Socket::SSL 1.56 must be installed for https support.

Der Versuch der Lösung

Ja. Um HTTP::Tiny kann über https zu müssen, wurde die Bibliothek IO::Socket::SSL.

Versuchen Sie zu liefern mit dem cpanm, aber erhalte eine Fehlermeldung:

root@faf6a4b66b08:/app# cpanm IO::Socket::SSL
--> Working on IO::Socket::SSL
Fetching http://www.cpan.org/authors/id/S/SU/SULLR/IO-Socket-SSL-2.066.tar.gz ... OK
==> Found dependencies: Net::SSLeay
--> Working on Net::SSLeay
Fetching http://www.cpan.org/authors/id/C/CH/CHRISN/Net-SSLeay-1.88.tar.gz ... OK
Configuring Net-SSLeay-1.88 ... OK
Building and testing Net-SSLeay-1.88 ... FAIL
! Installing Net::SSLeay failed. See /root/.cpanm/work/1577105006.3284/build.log for details. Retry with --force to force install it.
! Installing the dependencies failed: Module 'Net::SSLeay' is not installed
! Bailing out the installation for IO-Socket-SSL-2.066.
root@faf6a4b66b08:/app#

Wie aus loga für die Bibliothek IO::Socket::SSL installieren müssen Net::SSLeay, aber Net::SSLeay ist nicht installiert. In der Datei build.log können mehr Details zu sehen. Hier ist ein Ausschnitt aus dieser Datei:

cp lib/Net/SSLeay.pod blib/lib/Net/SSLeay.pod
/usr/bin/perl /usr/share/perl/5.18/ExtUtils/xsubpp  -typemap /usr/share/perl/5.18/ExtUtils/typemap -typemap typemap  SSLeay.xs > SSLeay.xsc && mv SSLeay.xsc SSLeay.c
cc -c   -D_REENTRANT -D_GNU_SOURCE -DDEBIAN -fstack-protector -fno-strict-aliasing -pipe -I/usr/local/include -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -O2 -g   -DVERSION=\"1.88\" -DXS_VERSION=\"1.88\" -fPIC "-I/usr/lib/perl/5.18/CORE"   SSLeay.c
SSLeay.xs:163:25: fatal error: openssl/err.h: No such file or directory
 #include  openssl/err.h
                         ^
compilation terminated.
make: *** [SSLeay.o] Error 1

Die erfolgreiche Lösung

Um HTTP::Tiny kann über https notwendig, um die Bibliothek zu installieren IO::Socket::SSL. So installieren Sie IO::Socket::SSL zu installieren Net::SSLeay. Und hier zum installieren der Bibliothek Net::SSLeay brauchen Sie einen zusätzlichen Bibliothek in das System.

Auf Ubuntu dies geschieht mit dem Befehl:

$ apt-get update && apt-get install -y libssl-dev

Anschließend müssen Sie IO::Socket::SSL:

# cpanm IO::Socket::SSL

Dieser Befehl erfolgreich installiert die Bibliothek Net::SSLeay und IO::Socket::SSL. Und danach HTTP::Tiny kann über https.

Andere Artikel