2017-12-31 148 views
0

웹 페이지의 데이터에 액세스하기 위해 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 www.cryptopia.co.nz:443에 연결할 수 없습니다 (잘못된 파일 설명자). < URL : https : //www.cryptopia.co.nz/api/GetCurrencies> JSON 텍스트는 개체 또는 배열이어야합니다 (단, number, string, true, false 또는 null이 있으면 허용하려면 allow_nonref를 사용하십시오.) 유효한 인증서로이 페이지에 계속 액세스 할 수 있습니까? – user9148262

+0

'get'과'getprint'는 다르게 동작합니다. 'get'은 내용 (성공) 또는'undef' (오류)를 반환합니다. 'undef'를 얻는다면 왜 그런지 알 수 없습니다.반면에'getprint'는 오류의 원인이되는 내용을 _ 인쇄합니다. 내용 자체가 아닌 HTTP 코드 (예 : '200'또는 '500')를 반환합니다. 따라서 단순히'get'를'getprint'로 대체 할 수는 없습니다. 나는 단지 그것을 보았습니다 _why_'get'이 실패했습니다. 'decode_json'이'500'을 해석하려고 시도했기 때문에 JSON 에러가 발생합니다 (물론 실패합니다). – PerlDuck

답변

4

이것은 Node_BS 대신 Perl LWP에 대해서만 this one과 본질적으로 동일한 질문입니다.

대상 사이트의 설정이 잘못되어 중간 인증서가 누락되었습니다. 이것은 SSLabs report에서 볼 수있다 :

This server's certificate chain is incomplete. Grade capped to B.

이 문제를 해결하기 위해 당신은 보안 및 비보안 옵션에 대한 두 가지가 있습니다. 안전하지 않지만 불행하게도 종종 제안 된 옵션은 모든 인증서 유효성 검사를 비활성화하는 것입니다. 은 응용 프로그램이 중간 공격에서 사람에 대해 취약 해지기 때문에 수행하지 마십시오.

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 확장 유효성 검사 보안 서버 CA"및 루트 "COMODO RSA 인증 기관"의 인증서에 대해. 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; 

여기에 표시되는 지문은 인증서를 볼 때 브라우저에서도 볼 수있는 지문입니다.