Wir haben Probleme, curl
keine Verbindung zu einem HTTPS-Server herzustellen:
$ curl https://the-problem-site.com (not the real URL!)
curl: (35) error:14077458:SSL routines:SSL23_GET_SERVER_HELLO:reason(1112)
1112 ist SSL_R_TLSV1_UNRECOGNIZED_NAME
in ssl.h
.
Wenn ich es openssl s_client -connect the-problem-site.com:443
stattdessen versuche, sehe ich
CONNECTED(00000003)
depth=1 /C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA
verify error:num=20:unable to get local issuer certificate
verify return:0
Certificate chain
0 s:/serialNumber=xx/C=xx/ST=xx/L=xxxx/O=xx/OU=xx/CN=the-problem-site.com
i:/C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA
1 s:/C=US/O=GeoTrust, Inc./CN=GeoTrust SSL CA
i:/C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
dh es sieht so aus, als ob das Problem darin besteht, dass es nicht vertraut /C=US/O=GeoTrust Inc./CN=GeoTrust Global CA
. Allerdings ist dieses Zertifikat installiert: es ist /etc/ssl/certs/GeoTrust_Global_CA.pem
, und wenn ich stattdessen ausführen
openssl s_client -connect the-problem-site.com:443 -CAfile /etc/ssl/certs/GeoTrust_Global_CA.pem
dann funktioniert alles. Das Zertifikat ist auch als Hash-Datei vorhanden b0f3e76e.0
und befindet sich in ca-certificates.crt
. Soweit ich jedoch sehen kann, versuchen weder curl noch openssl, Zertifikate zu lesen. Wenn ich strace
sie dann gibt es keinen Versuch, von /usr/lib/ssl/certs
oder /etc/ssl/certs
überhaupt zu lesen , auch nicht mit Fehlern. Es liest jedoch openssl.cnf. Wir sind gelaufen update-ca-certificates
.
Dies ist Ubuntu 10.04 mit openssl 0.9.8k. Wir können das Problem auf zwei separaten Installationen reproduzieren (obwohl es möglich ist, dass einer von früher ein Klon des anderen ist). Wenn ich den gleichen Test auf einer CentOS-VM mit openssl 0.9.8e versuche, funktioniert er einwandfrei und ich kann sehen, dass er die Zertifikatdatei einliest strace
. Es gibt keinen gleichwertigen Dateizugriff an derselben Stelle in den Ubuntu-Straces. Wenn ich die openssl.cnf
Datei von der CentOS-VM auf die Ubuntu-Computer kopiere , macht das keinen Unterschied. In der Umgebung oder in einer RC-Datei ist nichts offensichtlich, was dies verursachen könnte.
Irgendwelche Ideen, was ich falsch mache? Sollte dies funktionieren, dh sollten openssl und curl installierte Zertifizierungsstellen automatisch von der Befehlszeile abrufen? Wie ist das konfiguriert? Vielen Dank!
Ein weiterer Datenpunkt: Bei einer Neuinstallation von 13 Servern wird curl
die Zertifikatdatei abgerufen und funktioniert einwandfrei . openssl s_client
tut es aber immer noch nicht. Warum sollte das so sein?
Antworten:
Es gibt mehrere kryptografische Bibliotheken auf Ihrem System:
Alle haben natürlich Ähnlichkeiten und Unterschiede. Software, die sie verwendet (für kryptografische Zwecke oder zur Verwendung von SSL / TLS), unterstützt manchmal die Verwendung von mehr als einer dieser Bibliotheken (z. B. Lynx, der Webbrowser, ist normalerweise mit OpenSSL verknüpft, unterstützt jedoch auch GnuTLS (nur nicht so gut) in um die GNU zu beschwichtigen).
cURL ist auch eines der Projekte, die die Verwendung einer der drei wichtigsten Kryptobibliotheken unterstützen. Dies liegt hauptsächlich daran, dass cURL in erster Linie eine Bibliothek ist, die von anderen Programmen verwendet werden soll, wenn sie Dinge über http-, ftp- usw. Verbindungen herunterladen (oder sogar hochladen) möchten. Das
curl
Befehlszeilentool kann aus einer dieser Varianten stammen.Ich bin mir ziemlich sicher, dass das Problem mit dem nicht frisch installierten System das folgende ist:
OpenSSL und GnuTLS unterstützen beide die Verwendung von
/etc/ssl/certs/<hash>.<number>
CA-Verzeichnissen im Stil. OpenSSL Version 0.x und GnuTLS verwenden jedoch einen anderen Algorithmus zur Berechnung des oben genannten Hash als OpenSSL Version 1.x. (Beide können auf einem System koexistieren. Wenn verschiedene Zertifikate denselben Hash haben, verwenden Sie nur eine unterschiedliche Nummer . Aus irgendeinem Grundca-certificates
scheint das Debian / Ubuntu- Paket dies nicht zu tun.) Einige Versionen von GnuTLS haben dies nicht getan Unterstützung bei Verwendung des Verzeichnisses, jedoch nur bei Verwendung einer Datei/etc/ssl/certs/ca-certificates.crt
(die normalerweise auch von denca-certificates
Betreuerskripten des Pakets verwaltet wird , jedoch abweichen kann); Sie scheinen eine ältere Version zu verwenden, daher ist dies möglicherweise das, was Sie getroffen haben.openssl s_client
Standardmäßig (dh ohne die Option-CApath
oder-CAfile
) wird nirgendwo nach Zertifikaten gesucht.Ihre
curl
aus der aktualisierten Installation verwendete verwendet höchstwahrscheinlich eine andere Kryptobibliothek als diecurl
aus der Neuinstallation.Versuchen Sie
openssl s_client -CAfile /etc/ssl/certs/ca-certificates.crt -connect the-problem-site.com:443
zusätzlich,openssl s_client -CApath /etc/ssl/certs -connect the-problem-site.com:443
das Verhalten älterer GnuTLS-Versionen nachzuahmen.Überprüfen Sie noch einmal, ob sich irgendwo auf Ihrem System OpenSSL 1.x befindet (Ubuntu ist dafür bekannt, wichtige Updates auch in LTS-Versionen zu integrieren). Wenn ja, überprüfen Sie den Hash der Datei:
Normalerweise sollten entweder der zweite und der dritte Befehl fehlschlagen (OpenSSL 0.x), oder der erste und dritte Befehl sollten denselben Hash anzeigen, der zweite jedoch einen anderen Hash (OpenSSL 1.x). GnuTLS würde die Ausgabe des zweiten Befehls verwenden (wenn OpenSSL 1.x installiert ist); Wenn OpenSSL 0.x installiert ist, ist dies der gleiche Hash. Sie können solche Symlinks manuell erstellen.
Ich kann diesen Beitrag aktualisieren, sobald Sie Feedback zum Debuggen geben.
quelle