Corrección de errores de IO::Socket::SSL 1.56 must be installed for https support

En el lenguaje de programación Perl hay varias bibliotecas con las cuales se puede descargar información de internet a través de un HTTP. Саме conocidos es LWP y HTTP::Tiny. La biblioteca HTTP::Tiny viene con Perl, no es necesario instalarla, por lo tanto, a menudo es conveniente de descargar los datos con su ayuda.

El éxito de la carga de HTML página sobre el protocolo http

He aquí un ejemplo de código que se carga la página principal de sitio http://example.com. En este ejemplo se utiliza el protocolo http y no 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;

Cuando se ejecuta este código, se puede ver que todo funciona. Han recibido el estatus de 200. El campo successel valor de la es la verdad (en este texto para la comodidad de la pantalla de la estructura de datos tiene un campo de content se ha cambiado el valor, en lugar del código html de la página escriben tres puntos):

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

Error cuando se utiliza el protocolo https

Pero si modificar un poco el código y cargar los datos a través de https, lo los datos no se carguen. Aquí está el código del programa:

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

He aquí el resultado del trabajo de este programa:

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

El valor del campo status 599 (es un estado inventado en la biblioteca HTTP::Tiny, significa que el problema con la biblioteca). El valor de la success falsamente, y en el campo content hay una explicación de por qué se ha producido un error: IO::Socket::SSL 1.56 must be installed for https support.

En un intento de resolver

Aga. Para HTTP::Tiny podía trabajar sobre el protocolo https es necesario para la biblioteca IO::Socket::SSL.

Tratando de poner con la ayuda de la cpanm, pero obtiene un error:

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#

Como muestra el log para la biblioteca de IO::Socket::SSL es necesario instalar Net::SSLeay, pero Net::SSLeay no se instala. En el archivo de build.log se pueden ver los detalles. He aquí un fragmento de este archivo:

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

El éxito de la solución

Para HTTP::Tiny podría trabajar sobre el protocolo https es necesario instalar la biblioteca de IO::Socket::SSL. Para instalar IO::Socket::SSL es necesario instalar Net::SSLeay. He aquí para instalar la biblioteca de Net::SSLeay es necesario poner el archivo dll en el sistema.

En Ubuntu esto se hace con el comando:

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

Después de esto es necesario establecer IO::Socket::SSL:

# cpanm IO::Socket::SSL

Este comando instalará correctamente la biblioteca Net::SSLeay y IO::Socket::SSL. Y después de este HTTP::Tiny puede trabajar sobre el protocolo https.

Otros articulos