5 Stimmen

fehlgeschlagene Verbindung oder "Zertifikatsüberprüfung fehlgeschlagen" bei LWP HTTPS GET

Ich habe dieses Problem gestern auf Perl Monks gepostet, aber es funktionierte bei jedem, der es ausprobierte (siehe http://www.perlmonks.org/?node_id=909968 ). Ich habe jedoch eine andere URL verwendet, um das Problem zu vereinfachen.

Ich versuche, eine Verbindung zu api.betfair.com über HTTPS herzustellen, und sie haben ein gültiges Zertifikat, das ich in meinem Browser überprüft habe. Ich verwende Ubuntu und habe 2 Versionen von Perl. Die Systemversion 5.10.0 funktioniert, die über Perlbrew installierte Version 5.14.0 schlägt fehl. Der Code ist:

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;

Wenn ich dies unter dem System Perl 5.10.0 ausführe, funktioniert es gut und ich erhalte:

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

Wenn ich es unter Perl 5.14.0 ausführe, erhalte ich: Inhalt-Typ: text/plain Client-Datum: Fri, 17 Jun 2011 08:34:30 GMT Client-Warnung: Interne Antwort Kann keine Verbindung zu api.betfair.com:443 herstellen

Wenn ich die Einstellung von HTTPS_CA_FILE entferne und in 5.14.0 erneut ausführe, erhalte ich:

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.

Ich habe Mozilla::CA in der Version 20110409 installiert. Mozilla::CA::SSL_ca_file() gibt "/home/martin/perl5/perlbrew/perls/perl-5.14.0/lib/site_perl/5.14.0/Mozilla/CA/cacert.pem" zurück und es existiert und ist für mich lesbar. Ich verwende LWP 6.02 in Perl 5.14.0 und 5.836 in Perl 5.10.0. Ich habe gelesen, dass das Setzen von HTTPS_DEBUG=1 einige Debug-Informationen ausgeben sollte, aber es tut dies (bei mir) nur, wenn ich Perl 5.10.0 und nicht 5.14.0 verwende.

Ich bin kein SSL-Guru, aber ich habe einige Dinge ausprobiert, die ich gefunden habe, und sie haben mich nur noch mehr verwirrt:

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: Ich dachte, es läge daran, dass ich PERL_UNICODE=SAL eingestellt hatte, aber das Zurücksetzen dieser Einstellung behebt das Problem nicht.

UPDATE: Versionen: Linux ubuntu 10.10 Codename Maverick openssl 0.9.80 (ich glaube, auf meiner ubuntu-Distribution auf dem neuesten Stand

2voto

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

Nun, was soll's, es ist das gleiche dumme Zwischenzertifikat 0xeb99629b, das ich schon bei anderen Leuten vermisst habe, siehe obiger Kommentar für Details und wie man es bekommt.

Nur aus Neugierde: Welche Version von OpenSSL und ca-Zertifikaten verwenden Sie? Welche Systemversion/welchen Hersteller haben Sie?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X