이것은 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;
여기에 표시되는 지문은 인증서를 볼 때 브라우저에서도 볼 수있는 지문입니다.
'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 www.cryptopia.co.nz:443에 연결할 수 없습니다 (잘못된 파일 설명자). < URL : https : //www.cryptopia.co.nz/api/GetCurrencies> JSON 텍스트는 개체 또는 배열이어야합니다 (단, number, string, true, false 또는 null이 있으면 허용하려면 allow_nonref를 사용하십시오.) 유효한 인증서로이 페이지에 계속 액세스 할 수 있습니까? – user9148262
'get'과'getprint'는 다르게 동작합니다. 'get'은 내용 (성공) 또는'undef' (오류)를 반환합니다. 'undef'를 얻는다면 왜 그런지 알 수 없습니다.반면에'getprint'는 오류의 원인이되는 내용을 _ 인쇄합니다. 내용 자체가 아닌 HTTP 코드 (예 : '200'또는 '500')를 반환합니다. 따라서 단순히'get'를'getprint'로 대체 할 수는 없습니다. 나는 단지 그것을 보았습니다 _why_'get'이 실패했습니다. 'decode_json'이'500'을 해석하려고 시도했기 때문에 JSON 에러가 발생합니다 (물론 실패합니다). – PerlDuck