これは基本的にthis oneと同じ質問です.NodeJSの代わりにPerl LWPの場合のみです。
問題は、ターゲットサイトにセットアップが壊れていて、中間証明書が欠落していることです。これはSSLabs reportから見ることができます。
This server's certificate chain is incomplete. Grade capped to B.
この問題を回避するには、安全かつ安全でないオプションの2を持っています。安全ではありませんが、残念なことに、しばしば提案されているオプションは、すべての証明書の検証を無効にすることです。 中間の攻撃でアプリケーションを脆弱にするため、を実行しないでください。
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
が、この場合、PEM表現を連結したものです:
次のオプションは、すべての必要な証明書、つまり、ルートCAの両方とも欠けている中間CAを含み、独自のトラストストアを持つことです中間COMODO RSA Extended Validation Secure Server CAの証明書とルート "COMODO RSA Certification Authority"の証明書に適用されます。私はpastebinとして提供しましたhere。
3番目のオプションは、この特定のリーフ証明書だけを信頼することです。これを使用すると、証明書の有効期限が切れても、失効しても、ホスト名が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;
あなたがここに表示されている指紋は、証明書を見るときにブラウザで見ることができるものです。
'get()'を['getprint()'](http://search.cpan.org/~ether/libwww-perl-6.31/lib/LWP/Simple.pm#getprint)に置き換えるとそれは '500を与えますwww.cryptopia.co.nz:443に接続できません(証明書の検証に失敗しました)'。それはHTTP ** S **の問題です。おそらく彼らはポリシーを変更し、有効な証明書でページにアクセスできるようにしただけです。 –
PerlDuck
getprint()にget()を置き換えると、答えが "PerlDuck"ありがとうございます。以下のエラーが表示されます: '500 Can not connect to www.cryptopia.co.nz:443(不正なファイル記述子)< URL:https://www.cryptopia.co.nz/api/GetCurrencies> JSONテキストはオブジェクトまたは配列である必要があります(番号、文字列、true、falseまたはnullが見つかった場合はallow_nonrefを使用してください)。 有効な証明書でこのページにアクセスできますか? – user9148262
'get'と' getprint'は異なった振る舞いをします。 'get'は内容(成功)または' undef'(エラー)を返します。あなたが 'undef'を取得した場合、あなたはその理由を知らないのです。一方、 'getprint'は内容を出力します_or_エラーの原因。コンテンツ自体ではなく、HTTPコード(「200」や「500」など)を返します。だから単に 'get'を' getprint'で置き換えることはできません。私はちょうどそれが失敗するのを見るためにそれをしました。 'decode_json'が' 500'を解釈しようとしたのでJSONエラーが発生します(もちろん失敗します)。 – PerlDuck