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

问题描述 投票:0回答:1

我正在使用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工作一次,现在突然它不起作用。

先感谢您!!

perl
1个回答
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;

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

© www.soinside.com 2019 - 2024. All rights reserved.