Sửa lỗi IO::Socket::SSL 1.56 must be installed for https support

Perl ngôn ngữ có rất nhiều thư viện bạn có thể sử dụng để tải dữ liệu từ các giao Thức Internet HTTP. Người nổi tiếng nhất là LWPHTTP::Tiny. Thư viện HTTP::Tiny đến với Perl, nó không phải là không cần thiết để cài đặt thêm, vì vậy, nó là thường thuận tiện để tải dữ liệu với nó.

Thành công tải HTML trang giao Thức http

Đây là một ví dụ của mã vô nhà trang http://example.com. Trong ví dụ này sử dụng http và không http:

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

Nếu bạn chạy mã này, bạn có thể thấy mọi thứ hoạt động. Nhận được tình trạng của 200. Lĩnh vực successgiá trị là sự thật (trong văn bản này cho thuận tiện của màn hình, các dữ liệu cấu trúc có lĩnh vực content giá trị đã thay đổi, thay vì mã của những trang viết bởi ba chấm):

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

Lỗi khi sử dụng https

Nhưng nếu bạn thay đổi một ít mã này để tải dữ liệu hơn https, sau đó dữ liệu không được nạp. Đây là mã của chương trình:

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

Đây là kết quả từ chương trình này:

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

Các giá trị của trường status 599 (này trạng thái đặc biệt là phát minh ra trong thư viện HTTP::Tiny, nó có nghĩa là các vấn đề là với thư viện). Các giá trị success là sai, và content có một lời giải thích lý do tại sao các lỗi xảy ra: IO::Socket::SSL 1.56 must be installed for https support.

Cố gắng giải quyết

Yeah. Để HTTP::Tiny để làm việc qua https cần phải thư viện IO::Socket::SSL.

Cố gắng đưa mình với cpanm, nhưng nhận sự đề:

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#

Như các bạn có thể thấy từ nhật ký cho các thư viện IO::Socket::SSL cần phải cài đặt Net::SSLeay, nhưng Net::SSLeay là không cài đặt. Trong các tập tin build.log bạn có thể xem chi tiết. Đây là một đoạn của tập tin đó:

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

Một giải pháp thành công

Để HTTP::Tiny có thể làm việc trên giao Thức https cần phải cài đặt thư viện IO::Socket::SSL. Để thiết lập IO::Socket::SSL cần phải cài đặt Net::SSLeay. Nhưng để cài đặt thư viện Net::SSLeay bạn cần để đặt thêm một thư viện để các hệ thống.

Trên ổ điều này được thực hiện với lệnh:

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

Sau này, bạn cần phải cài đặt IO::Socket::SSL:

# cpanm IO::Socket::SSL

Lệnh này sẽ thành công cài đặt các thư viện Net::SSLeayIO::Socket::SSL. Và sau đó, HTTP::Tiny sẽ có thể làm việc trên giao Thức https.

Các bài viết khác