Korrektion af fejl IO::Socket::SSL 1.56 must be installed for https support

I programmeringssproget Perl der er flere biblioteker, kan du bruge for at hente data fra Internettet Protokol HTTP. Den mest berømte er LWP og HTTP::Tiny. Bibliotek HTTP::Tiny leveres med Perl, det er ikke nødvendigt at installere yderligere, derfor, det er ofte praktisk at hente data med det.

Vellykket download HTML side Protokol http

Her er et eksempel på kode, der indlæser startside http://example.com. I dette eksempel bruger http-og ikke 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;

Hvis du køre denne kode, kan du se, at alt virker. Fik status af 200. Området successværdi er sand (i denne tekst for at lette vise, data strukturer felter content værdien blev ændret, i stedet for at html-koden på den side, der er skrevet med tre prikker):

$ 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'
        };

Fejl, når du bruger https

Men hvis du ændrer lidt på denne kode til at hente data via https, så data er ikke indlæst. Her er koden for programmet:

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

Her er output fra dette program:

$ 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
'
        };

Værdien af feltet status 599 (denne særlige status blev opfundet i biblioteket HTTP::Tiny, det betyder, at problemet med biblioteket). Værdien success er falsk, og den content der er en forklaring på, hvorfor fejlen opstod: IO::Socket::SSL 1.56 must be installed for https support.

Prøv at løse

Ja. At HTTP::Tiny til at arbejde over https, skal biblioteket IO::Socket::SSL.

Prøv at sætte hende med cpanm, men får fejlen:

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#

Som du kan se loggen for bibliotek IO::Socket::SSL nødt til at installere Net::SSLeay, men Net::SSLeay er ikke installeret. I filen build.log kan du se detaljerne. Her er et uddrag af filen:

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

En succesfuld løsning

At HTTP::Tiny kunne arbejde på Protokollen https nødt til at installere bibliotek IO::Socket::SSL. For at indstille IO::Socket::SSL er nødt til at installere Net::SSLeay. Men for at installere biblioteket Net::SSLeay er du nødt til at sætte et ekstra bibliotek til systemet.

På Ubuntu, dette gøres med kommandoen:

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

Efter dette, er du nødt til at installere IO::Socket::SSL:

# cpanm IO::Socket::SSL

Denne kommando vil kunne installere bibliotek Net::SSLeay og IO::Socket::SSL. Og så HTTP::Tiny vil være i stand til at arbejde på Protokollen https.

Andre artikler