Perl LWP :: Simple :: get($ url)对某些网址不起作用

时间:2017-12-31 13:30:32

标签: perl

我正在使用LWP :: Simple :: get($ url)库来访问网页中的数据。问题是get函数不适用于以下url。 以下是代码段:

#!/usr/bin/perl

use LWP::Simple;
use JSON;
use Data::Dumper;

my $url = "https://www.cryptopia.co.nz/api/GetCurrencies";

my $json = get( $url);
die "Could not get $url!" unless defined $json;

my $decoded_json = decode_json($json);
print Dumper($decoded_json);

运行此代码后,它会出现以下错误:

  

无法获取https://www.cryptopia.co.nz/api/GetCurrencies

当我将网址替换为:$url = "https://api.coinmarketcap.com/v1/ticker/"时,它可以正常工作。 请问您能告诉我根本原因是什么以及如何解决它。 此外,代码段中提到的url工作了一次,但现在突然它不起作用。

提前谢谢!!

1 个答案:

答案 0 :(得分:4)

这与this one基本相同,仅适用于Perl LWP而非NodeJS。

问题是目标站点的设置已损坏且缺少中间证书。这可以从SSLabs report

中看出
  

此服务器的证书链不完整。等级上限为B.

要解决此问题,您有两个安全且不安全的选项。不安全但不幸的是经常提出的选项是禁用所有证书验证。 不要这样做,因为它会使您的应用程序在中间攻击时容易受到攻击。

下一个选项是拥有自己的信任存储,其中包括所有必需的证书,即根CA和缺少的中间CA:

use strict;
use warnings;
use LWP::UserAgent;
use IO::Socket::SSL;
my $ua = LWP::UserAgent->new;
$ua->ssl_opts(
    SSL_ca_file => 'myca.pem', 
    # disable OCSP stapling since it results in problems with this site
    SSL_ocsp_mode => SSL_OCSP_NO_STAPLE
);
my $resp = $ua->get('https://www.cryptopia.co.nz/api/GetCurrencies');
print $resp->decoded_content;
在这种情况下,

myca.pem是中间“COMODO RSA扩展验证安全服务器CA”和根“COMODO RSA证书颁发机构”的证书的PEM表示的串联。我已将其作为pastebin here提供。

第三种选择是仅信任此特定叶证书。使用时,这将信任使用此证书的服务器,无论证书是否已过期,已撤销,主机名与URL不匹配,或者(因为在这种情况下)由于缺少中间证书而无法构建信任链:

use strict;
use warnings;
use LWP::UserAgent;
use IO::Socket::SSL;

my $ua = LWP::UserAgent->new;
$ua->ssl_opts(
    SSL_fingerprint => 'sha256$70bca153ac950b8fa92d20f04dceca929852c42dc1d51bdc3c290df256ae05d3',
    SSL_ocsp_mode => SSL_OCSP_NO_STAPLE,
);
my $resp = $ua->get('https://www.cryptopia.co.nz/api/GetCurrencies');
print $resp->decoded_content;

您在此处看到的指纹是您在查看证书时也可以在浏览器中看到的指纹。