简体   繁体   English

LWP HTTPS GET上的连接失败或“证书验证失败”

[英]failed connect or “certificate verify failed” on LWP HTTPS GET

I posted this problem on Perl Monks yesterday but it worked for everyone who tried it (see http://www.perlmonks.org/?node_id=909968 ). 我昨天在Perl Monks上发布了此问题,但它对尝试过此问题的每个人都有效(请参阅http://www.perlmonks.org/?node_id=909968 )。 However, I was using a different URL hoping to simplify the problem. 但是,我使用了另一个URL,希望可以简化问题。

I'm attempting to connect to api.betfair.com via HTTPS and they have a valid certificate which I've verified in my browser. 我正在尝试通过HTTPS连接到api.betfair.com,并且它们具有有效的证书,该证书已经在浏览器中进行了验证。 I am running ubuntu and have 2 versions of Perl. 我正在运行ubuntu,并且有2个版本的Perl。 The system one 5.10.0 works and 5.14.0 installed via perlbrew fails. 5.10.0可以正常运行的系统,而通过perlbrew安装的5.14.0则无法运行。 The code is: 代码是:

use LWP::UserAgent; 
use strict;
use warnings;

#$ENV{HTTPS_CA_FILE} = "/usr/share/ca-certificates/cacert.org/cacert.org.crt";

my $ua  = LWP::UserAgent->new; 
my $req = HTTP::Request->new(GET => 'https://api.betfair.com');
my $res = $ua->request($req);

print $res->headers_as_string;
print $res->content;

Running this under the system Perl 5.10.0 it works fine and I get: 在Perl 5.10.0系统下运行它,可以正常工作,我得到:

Date: Fri, 17 Jun 2011 08:33:04 GMT
Accept-Ranges: bytes
ETag: W/"0-1307353787000"
Content-Length: 0
Content-Type: text/html
Last-Modified: Mon, 06 Jun 2011 09:49:47 GMT
Client-Date: Fri, 17 Jun 2011 08:33:04 GMT
Client-Peer: 84.20.200.10:443
Client-Response-Num: 1
Client-SSL-Cert-Issuer: /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)09/CN=VeriSign Class 3 Secure Server CA - G2
Client-SSL-Cert-Subject: /C=GB/ST=London/L=London/O=The Sporting Exchange Ltd/OU=IS/OU=Terms of use at www.verisign.com/rpa (c)05/CN=*.betfair.com
Client-SSL-Cipher: RC4-MD5
Set-Cookie: NSC_mc-80-qvcbqj.efgbvmu=ffffffff09208c5545525d5f4f58455e445a4a4229a0;expires=Fri, 17-Jun-2011 20:33:05 GMT;path=/;httponly

Running it under Perl 5.14.0 I get: Content-Type: text/plain Client-Date: Fri, 17 Jun 2011 08:34:30 GMT Client-Warning: Internal response Can't connect to api.betfair.com:443 在Perl 5.14.0下运行它我得到: 内容类型:text / plain客户端日期:2011年6月17日星期五,格林尼治标准时间客户端警告:内部响应无法连接到api.betfair.com:443

\n

If I uncomment the setting of HTTPS_CA_FILE and rerun in 5.14.0 I get: 如果取消注释HTTPS_CA_FILE的设置并在5.14.0中重新运行,则会得到:

Content-Type: text/plain
Client-Date: Fri, 17 Jun 2011 08:35:09 GMT
Client-Warning: Internal response
Can't connect to api.betfair.com:443 (certificate verify failed)

LWP::Protocol::https::Socket: SSL connect attempt failed with unknown errorerror:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed at /home/martin/perl5/perlbrew/perls/perl-5.14.0/lib/site_perl/5.14.0/LWP/Protocol/http.pm line 51.

I have Mozilla::CA installed at version 20110409. Mozilla::CA::SSL_ca_file() returns "/home/martin/perl5/perlbrew/perls/perl-5.14.0/lib/site_perl/5.14.0/Mozilla/CA/cacert.pem" and it exists and is readable by me. 我在版本20110409上安装了Mozilla :: CA。Mozilla :: CA :: SSL_ca_file()返回“ /home/martin/perl5/perlbrew/perls/perl-5.14.0/lib/site_perl/5.14.0/Mozilla/CA /cacert.pem”,并且该目录存在并可供我读取。 I am using LWP 6.02 in Perl 5.14.0 and 5.836 in Perl 5.10.0. 我在Perl 5.14.0中使用LWP 6.02,在Perl 5.10.0中使用5.836。 I read setting HTTPS_DEBUG=1 should output some debug info but it only does this (for me) when using Perl 5.10.0 and not 5.14.0. 我读到设置HTTPS_DEBUG = 1应该输出一些调试信息,但是(仅对我而言)使用Perl 5.10.0而不是5.14.0时才这样做。

I'm not an SSL guru by any means but I tried some things I found and they just make me more confused: 无论如何,我都不是SSL专家,但是我尝试了一些发现的事情,它们只会使我更加困惑:

openssl verify -verbose -CAfile /home/martin/perl5/perlbrew/perls/perl-5.14.0/lib/site_perl/5.14.0/Mozilla/CA/cacert.pem < /dev/null
unable to load certificate
10888:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:647:Expecting: TRUSTED CERTIFICATE

openssl s_client -CAfile /usr/local/share/perl/5.10.0/Mozilla/CA/cacert.pem -connect api.betfair.com:443 < /dev/null
CONNECTED(00000003)
depth=1 /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)09/CN=VeriSign Class 3 Secure Server CA - G2
verify error:num=20:unable to get local issuer certificate
verify return:0
---
Certificate chain
 0 s:/C=GB/ST=London/L=London/O=The Sporting Exchange Ltd/OU=IS/OU=Terms of use at www.verisign.com/rpa (c)05/CN=*.betfair.com
   i:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)09/CN=VeriSign Class 3 Secure Server CA - G2
 1 s:/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)09/CN=VeriSign Class 3 Secure Server CA - G2
   i:/C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority - G2/OU=(c) 1998 VeriSign, Inc. - For authorized use only/OU=VeriSign Trust Network
---
Server certificate
-----BEGIN CERTIFICATE-----
certificate snipped
sg==
-----END CERTIFICATE-----
subject=/C=GB/ST=London/L=London/O=The Sporting Exchange Ltd/OU=IS/OU=Terms of use at www.verisign.com/rpa (c)05/CN=*.betfair.com
issuer=/C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at https://www.verisign.com/rpa (c)09/CN=VeriSign Class 3 Secure Server CA - G2
---
No client certificate CA names sent
---
SSL handshake has read 3068 bytes and written 303 bytes
---
New, TLSv1/SSLv3, Cipher is RC4-MD5
Server public key is 1024 bit
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
SSL-Session:
    Protocol  : TLSv1
    Cipher    : RC4-MD5
    Session-ID: 81802384A47AF45D2D809A2D10041A4E0B4B4DD821507569216A199ED467B207
    Session-ID-ctx: 
    Master-Key: 50DEC11CD2FA57E9BFA95B0156905D2717A79F333A2028FCCCB0F1C32A6B35202A958CEF24D3D2332A00CDCD158B40FB
    Key-Arg   : None
    Start Time: 1308304989
    Timeout   : 300 (sec)
    Verify return code: 20 (unable to get local issuer certificate)
---
DONE

UPDATE: I thought it was because I had PERL_UNICODE=SAL set but unsetting this does not fix the problem. 更新:我以为是因为设置了PERL_UNICODE = SAL,但是取消设置并不能解决问题。

UPDATE: versions: Linux ubuntu 10.10 codename maverick openssl 0.9.80 (I believe up to date on my ubuntu distribution 更新:版本:Linux ubuntu 10.10代号maverick openssl 0.9.80(我相信我的ubuntu发行版是最新的

$ openssl s_client -connect api.betfair.com:443 < /dev/null > api.betfair.com.pem
$ openssl x509 -in api.betfair.com.pem -issuer_hash
eb99629b

Well, whaddayasay, it's the same stupid intermediate certificate 0xeb99629b I've seen missing before with other people, see comment above for details and how to get it. 好吧,whaddayasay,它是我之前在其他人面前见过的相同的愚蠢中间证书0xeb99629b,请参阅上面评论以获取详细信息和获取方法。

Out of curiosity, what version of OpenSSL and ca-certificates are you running? 出于好奇,您正在运行哪个版本的OpenSSL和ca证书? What's your system version/vendor? 您的系统版本/供应商是什么?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM