OpenSSL nimmt keine Zertifizierungsstellen im Ordner "Zertifikate" auf

9

Wir haben Probleme, curlkeine 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_NAMEin ssl.h.

Wenn ich es openssl s_client -connect the-problem-site.com:443stattdessen 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.0und befindet sich in ca-certificates.crt. Soweit ich jedoch sehen kann, versuchen weder curl noch openssl, Zertifikate zu lesen. Wenn ich stracesie dann gibt es keinen Versuch, von /usr/lib/ssl/certsoder /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.cnfDatei 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 curldie Zertifikatdatei abgerufen und funktioniert einwandfrei . openssl s_clienttut es aber immer noch nicht. Warum sollte das so sein?

Rup
quelle
Wir haben genau das gleiche Problem. Ich spüre etwas Unverschämtheit in openssl!
Milosgajdos
@ Rup Haben Sie eine Lösung dafür gefunden? Bitte fügen Sie eine Antwort hinzu und markieren Sie sie, wenn dies der Fall ist. Wir sehen das gleiche Verhalten.
Mike S
@ MikeS Soweit ich weiß, tut mir leid, aber ich bin nicht in diesem Team. Ich werde sie morgen fragen.
Rup

Antworten:

4

Es gibt mehrere kryptografische Bibliotheken auf Ihrem System:

  • OpenSSL (der Goldstandard mit einer BSD-ähnlichen (sehr kostenlosen) Lizenz, die eine etwas problematische Klausel enthält (Verhinderung der GPL-Kompatibilität, aber nichts „Schlechtes“), die die Einführung in der GNU-Welt einschränkt)
  • GnuTLS (der Ersatz aus dem FSF; gibt es in zwei Varianten: LGPLv2-lizenziert (aber nicht gewartet) und LGPLv3-lizenziert (und daher nicht mit GPLv2-Programmen kompatibel); historisch gesehen nicht so funktionsfähig wie OpenSSL, etwas fehlerhafter, aber strenger auch, was die Sicherheit erhöht)
  • NSS (Netscape / Mozilla-Bibliothek, die nur selten im Freien verwendet wird; nur langsam neue Standards einführen)
  • kleinere wie PolarSSL, MatrixSSL, NaCl / Salt

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 curlBefehlszeilentool 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 Grund ca-certificatesscheint 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 den ca-certificatesBetreuerskripten 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_clientStandardmäßig (dh ohne die Option -CApathoder -CAfile) wird nirgendwo nach Zertifikaten gesucht.

Ihre curlaus der aktualisierten Installation verwendete verwendet höchstwahrscheinlich eine andere Kryptobibliothek als die curlaus der Neuinstallation.

Versuchen Sie openssl s_client -CAfile /etc/ssl/certs/ca-certificates.crt -connect the-problem-site.com:443zusätzlich, openssl s_client -CApath /etc/ssl/certs -connect the-problem-site.com:443das 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:

openssl x509 -noout -hash -in /etc/ssl/certs/GeoTrust_Global_CA.pem
openssl x509 -noout -subject_hash_old -in /etc/ssl/certs/GeoTrust_Global_CA.pem
openssl x509 -noout -subject_hash -in /etc/ssl/certs/GeoTrust_Global_CA.pem

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.

Mirabilos
quelle