2017-12-31 221 views
0

WebページからデータにアクセスするためにLWP :: Simple :: get($ url)ライブラリを使用しています。問題は、get関数が下のURLで機能していないことです。それが正常に動作します$url = "https://api.coinmarketcap.com/v1/ticker/":私は、URLを交換するとき

Could not get https://www.cryptopia.co.nz/api/GetCurrencies !

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

このコードを実行した後、それは以下のエラーを与える: は、以下のコードです。 根本的な原因と解決方法を教えてください。 また、コードスニペットに記載されているURLは一度動作し、突然動作しません。

ありがとうございました!

+0

'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

+0

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

+0

'get'と' getprint'は異なった振る舞いをします。 'get'は内容(成功)または' undef'(エラー)を返します。あなたが 'undef'を取得した場合、あなたはその理由を知らないのです。一方、 'getprint'は内容を出力します_or_エラーの原因。コンテンツ自体ではなく、HTTPコード(「200」や「500」など)を返します。だから単に 'get'を' getprint'で置き換えることはできません。私はちょうどそれが失敗するのを見るためにそれをしました。 'decode_json'が' 500'を解釈しようとしたのでJSONエラーが発生します(もちろん失敗します)。 – PerlDuck

答えて

4

これは基本的に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; 

あなたがここに表示されている指紋は、証明書を見るときにブラウザで見ることができるものです。

関連する問題