Die Ausgabe von openssl s_client verstehen

14

Seitdem unser E-Mail-Anbieter sein SSL-Zertifikat geändert hat, weigert sich ein POP3-Client auf der Basis von Mono, eine Verbindung zu seinem sicheren POP-Server herzustellen, um E-Mails herunterzuladen. Andere Kunden haben kein Problem. zB Thunderbird und Outlook; Die meisten SSL-Überprüfungssites, die ungerade Ports überprüfen können, außer diesem . Ich habe mit beiden Anbietern zusammengearbeitet, um das Problem zu identifizieren, bin aber mit beiden letztendlich in eine Sackgasse geraten, da ich nicht genug über SSL-Zertifikate weiß, um einen der beiden Anbieter dazu zu bringen, die Fehlerursache zu verstehen.

Während der Untersuchung wurde meine Aufmerksamkeit auf den Unterschied in der Ausgabe der folgenden zwei Befehle gelenkt (ich habe die Zertifikate aus Gründen der Lesbarkeit aus der Ausgabe entfernt):

echo "" | openssl s_client -showcerts -connect pop.gmail.com:995

VERBUNDEN (00000003)
Tiefe = 2 / C = US / O = GeoTrust Inc./CN=GeoTrust Global CA
überprüfen Fehler: num = 20: unable lokale Aussteller - Zertifikat erhalten
Rückgabe bestätigen: 0
---
Zertifikatskette
 0 s: / C = USA / ST = Kalifornien / L = Bergblick / O = Google Inc / CN = pop.gmail.com
   i: / C = USA / O = Google Inc. / CN = Google Internet Authority G2
----- ZERTIFIKAT BEGINNEN -----
----- ZERTIFIKAT BEENDEN -----
 1 s: / C = US / O = Google Inc. / CN = Google Internet Authority G2
   i: / C = US / O = GeoTrust Inc./CN=GeoTrust Global CA
----- ZERTIFIKAT BEGINNEN -----
----- ZERTIFIKAT BEENDEN -----
 2 s: / C = US / O = GeoTrust Inc./CN=GeoTrust Global CA
   i: / C = US / O = Equifax / OU = Sichere Equifax-Zertifizierungsstelle
----- ZERTIFIKAT BEGINNEN -----
----- ZERTIFIKAT BEENDEN -----
---
Serverzertifikat
subject = / C = USA / ST = Kalifornien / L = Mountain View / O = Google Inc / CN = pop.gmail.com
Emittent = / C = US / O = Google Inc. / CN = Google Internet Authority G2
---
Es wurden keine CA-Namen für Client-Zertifikate gesendet
---
SSL-Handshake hat 3236 Bytes gelesen und 435 Bytes geschrieben
---
Neu, TLSv1 / SSLv3, Verschlüsselung ist RC4-SHA
Der öffentliche Schlüssel des Servers ist 2048 Bit
Secure Renegotiation wird unterstützt
Kompression: KEINE
Erweiterung: KEINE
SSL-Sitzung:
    Protokoll: TLSv1
    Chiffre: RC4-SHA
    Sitzungs-ID: 745F84194498529B91B7D9194363CBBD23425446CF2BFF3BF5557E3C6606CA06
    Session-ID-ctx:
    Hauptschlüssel: DED1AE0A44609F9D6F54626F4370ED96436A561A59F64D66240A277066322DCD2CCB9A6D198C95F4D2B0C7E6781EECD2
    Key-Arg: Keine
    Startzeit: 1397678434
    Zeitlimit: 300 (Sek.)
    Überprüfen Sie den Rückkehrcode: 20 (lokales Ausstellerzertifikat kann nicht abgerufen werden)
---
+ OK Gpop bereit für Anfragen vom 69.3.61.10 c13mb42148040pdj
ERLEDIGT

echo "" | openssl s_client -showcerts -connect secure.emailsrvr.com:995

VERBUNDEN (00000003)
Tiefe = 2 / C = US / O = GeoTrust Inc./CN=GeoTrust Global CA
Überprüfungsfehler : num = 19: Selbstsigniertes Zertifikat in der Zertifikatkette
Rückgabe bestätigen: 0
---
Zertifikatskette
 0 s: / serialNumber = tG0GnsyAUkdX7DEo15ylNBjQJqAWZ / dD / OU = 4159320284 / OU = Siehe www.rapidssl.com/resources/cps (c) 14 / OU = Domain Control Validated - RapidSSL (R) /CN=secure.emailsrvr.com
   i: / C = US / O = GeoTrust, Inc./CN=RapidSSL CA
----- ZERTIFIKAT BEGINNEN -----
----- ZERTIFIKAT BEENDEN -----
 1 s: / C = US / O = GeoTrust, Inc./CN=RapidSSL CA
   i: / C = US / O = GeoTrust Inc./CN=GeoTrust Global CA
----- ZERTIFIKAT BEGINNEN -----
----- ZERTIFIKAT BEENDEN -----
 2 s: / C = US / O = GeoTrust Inc./CN=GeoTrust Global CA
   i: / C = US / O = GeoTrust Inc./CN=GeoTrust Global CA
----- ZERTIFIKAT BEGINNEN -----
----- ZERTIFIKAT BEENDEN -----
---
Serverzertifikat
subject = / serialNumber = tG0GnsyAUkdX7DEo15ylNBjQJqAWZ / dD / OU = 4159320284 / OU = Siehe www.rapidssl.com/resources/cps (c) 14 / OU = Domain Control Validated - RapidSSL (R) /CN=secure.emailsrvr.com
Emittent = / C = US / O = GeoTrust, Inc./CN=RapidSSL CA
---
Es wurden keine CA-Namen für Client-Zertifikate gesendet
---
Der SSL-Handshake hat 3876 Bytes gelesen und 319 Bytes geschrieben
---
Neu, TLSv1 / SSLv3, Verschlüsselung ist DHE-RSA-AES256-SHA
Der öffentliche Schlüssel des Servers ist 2048 Bit
Secure Renegotiation wird unterstützt
Kompression: KEINE
Erweiterung: KEINE
SSL-Sitzung:
    Protokoll: TLSv1
    Verschlüsselung: DHE-RSA-AES256-SHA
    Sitzungs-ID: 3F4EE3992B46727BE2C7C3E76A9A6A8D64D66EE843CB1BB17A76AE2E030C7161
    Session-ID-ctx:
    Hauptschlüssel: 016209E50432EFE2359DB73AB527AF718152BFE6F88215A9CE40604E8FF2E2A3AC97A175F46DF737596866A8BC8E3F7F
    Key-Arg: Keine
    Startzeit: 1397678467
    Zeitlimit: 300 (Sek.)
    Überprüfen Sie den Rückkehrcode: 19 (selbstsigniertes Zertifikat in der Zertifikatskette)
---
ERLEDIGT

Ich habe versucht zu verstehen, ob dies sinnvoll ist, da -CApathdie Befehle bei Angabe der Option keine Fehler verursachen:

openssl s_client -CApath /etc/ssl/certs -showcerts -connect secure.emailsrvr.com:995

CONNECTED(00000003)
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify return:1
depth=1 C = US, O = "GeoTrust, Inc.", CN = RapidSSL CA
verify return:1
depth=0 serialNumber = tG0GnsyAUkdX7DEo15ylNBjQJqAWZ/dD, OU = 4159320284, OU = See www.rapidssl.com/resources/cps (c)14, OU = Domain Control Validated - RapidSSL(R), CN = secure.emailsrvr.com
verify return:1
...

openssl s_client -CApath /etc/ssl/certs -showcerts -connect pop.gmail.com:995

CONNECTED(00000003)
depth=3 C = US, O = Equifax, OU = Equifax Secure Certificate Authority
verify return:1
depth=2 C = US, O = GeoTrust Inc., CN = GeoTrust Global CA
verify return:1
depth=1 C = US, O = Google Inc, CN = Google Internet Authority G2
verify return:1
depth=0 C = US, ST = California, L = Mountain View, O = Google Inc, CN = pop.gmail.com
verify return:1
...

Ich kann die -CAfileOption auch erfolgreich verwenden, nachdem ich das CAfile-Zertifikat direkt von GeoTrust heruntergeladen habe .

Trotzdem scheint Fog Creek der Meinung zu sein, dass das Problem beim Zertifikat liegt, da sie versucht haben, das Zertifikat Trustohne Erfolg in Monos Geschäft zu integrieren. Ich würde mit ihnen nicht einverstanden sein, aber (wie oben erwähnt), während die meisten SSL-Prüfer entweder Port 995 nicht überprüfen oder während des Versuchs erfolgreich waren, fand ich diese Seite , die SSL-Fehler 7 erzeugt.

Interpretiere ich die Ausgabe richtig, um zu bedeuten, dass mit dem Zertifikat nichts falsch ist?

jobu1324
quelle
2
Ich denke, der Fehler "selbstsigniertes Zertifikat in Zertifikatskette" ist ein roter Hering. Eine Stammzertifizierungsstelle ist immer selbstsigniert, sodass ein Server, der seine vollständige Zertifikatkette zurückgibt, immer ein selbstsigniertes Zertifikat zurückgibt. Mehr Infos hier .
Bennettp123
2
Eigentlich scheint openssl s_clientes, dass standardmäßig keine Root-Zertifikate importiert werden. Versuchen Sie es stattdessen mit:, openssl s_client -connect secure.emailsrvr.com:995 -showcerts -CApath /etc/ssl/certsund Sie werden wahrscheinlich feststellen, dass der selbstsignierte Fehler verschwindet.
Bennettp123
@ bennettp123 Ich stelle die Ausgabe dieses Befehls am Ende der Frage fest. Habe ich Recht, die Ausgabe beider Versionen des Befehls so zu verstehen, dass das Zertifikat gültig ist?
Jobu1324
Ja, laut dieser Ausgabe glaubt openssl, dass das Zertifikat gültig ist. Warum wird es abgelehnt? Ich weiß es nicht. Dies kann daran liegen, dass das Feld Organisation nicht festgelegt ist, dies ist jedoch nur eine Vermutung.
bennettp123

Antworten:

5

Die Antwort (wie in diesem security.SE-Beitrag erläutert ) lautet, dass die beiden GeoTrust Global CA- Zertifikate, die Sie in der Kette sehen, nicht dasselbe Zertifikat sind, sondern voneinander abgeleitet sind.

Wegen CA Cross-Signing!

Als das GeoTrust Global CA-Zertifikat zum ersten Mal erstellt und signiert wurde, hatte es kein Computer / Browser / keine Anwendung in seinem Trust Store.

Wenn eine andere Zertifizierungsstelle (mit einer bereits vorhandenen Reputation und Distribution) das GeoTrust-Stammzertifizierungsstellenzertifikat signiert, kann das resultierende Zertifikat (das als "Bridge" -Zertifikat bezeichnet wird) jetzt von der zweiten Zertifizierungsstelle überprüft werden, ohne dass das GeoTrust-Stammzertifizierungsstellenzertifikat vorhanden ist vom Kunden ausdrücklich zu vertrauen.

Wenn Google die signierte Version des GeoTrust-Stammzertifizierungsstellenzertifikats vorlegt, kann ein Client, der dem Original nicht vertraut, das Equifax-Zertifizierungsstellenzertifikat nur zum Überprüfen von GeoTrust verwenden. Equifax fungiert also als eine Art "älterer" Vertrauensanker.

Mathias R. Jessen
quelle
Aus diesem Grund sind die beiden Serverketten unterschiedlich und dennoch beide gültig. Dies ist jedoch nicht unbedingt der Grund für das Problem des OP mit dem Mono-Client, ohne eindeutige Daten darüber, welche Roots sich im Truststore der jeweiligen Mono-Instanz befinden und welche nicht.
Dave_Thompson_085
0

Ich hatte ein ähnliches Problem mit fetchmail, als ich die SSL-Prüfung für aktiviert habe pop.gmail.com.

Ich habe die Equifax-PEM-Datei heruntergeladen, aber sie funktionierte nicht wie sie ist. Sie musste ausgeführt werden, c_rehash ssl/certswodurch ein symbolischer Link mit einem Hashwert erstellt wurde. Dann funktionierte sie einfach.

Alternativ kann der Hash-Wert auch durch Ausführen von ... ermittelt werden.

openssl x509 -in Equifax_Secure_Certificate_Authority.pem -fingerprint -subject -issuer -serial -hash -noout | sed  -n /^[0-9]/p

https://www.geotrust.com/resources/root_certificates/certificates/Equifax_Secure_Certificate_Authority.pem

chetangb
quelle
Könnten Sie bitte erweitern, was mit der verknüpften PEM-Datei zu tun ist?
Sebix
# ldd / usr / bin / fetchmail | grep ssl libssl.so.10 => /lib64/libssl.so.10
chetangb
Was ich vor einiger Zeit gelesen habe, ist, dass Fetchmail OpenSSL- Bibliotheken verwendet und nur nach dem Hash-Wert des Zertifikats productforums.google.com/forum/#!topic/gmail/tqjOmqxpMKY # ldd / usr / bin / fetchmail | aussieht grep ssl libssl.so.10 => /lib64/libssl.so.10 yum whatprovides libssl.so.10 openssl-libs-1.0.1e-42.el7.i686: Eine universelle Kryptografie-Bibliothek mit TLS-Implementierung Repo: base Matched von: Bietet: libssl.so.10
chetangb
Bitte erweitern Sie Ihre Antwort und erklären Sie, was das Problem sein kann, das Sie erreichen möchten.
Sebix
0

Während des Erzeugens und Konfigurierens von Zertifikaten sollte man auch die openssl.cnfDatei (Debian - /etc/ssl/openssl.cnf) aktualisieren , um den korrekten Pfad, die Zertifikatsnamen usw. anzugeben, dann kann man den Befehl ausführen und sie ohne -CApathOption überprüfen .

Und dementsprechend könnten in diesem Fall auch entfernte Hosts Ihre Zertifikate ordnungsgemäß überprüfen.

Hier ist der entsprechende openssl.cnfAbschnitt:

####################################################################
[ ca ]

default_ca  = CA_default        # The default ca section

####################################################################
[ CA_default ]

dir     = /etc/ssl  
user155270
quelle
1
Das ist falsch . Die default_caDaten in der (beliebigen) Konfigurationsdatei openssl werden nur für das Dienstprogramm 'ca' verwendet, um Zertifikate auszustellen und optional zu widerrufen, niemals zur Überprüfung. Das Ändern des Standard-Bestätigungsspeichers (neben dem Neukompilieren) erfolgt mit erneuten Kompilieren Umgebungsvariablen SSL_CERT_ {FILE, DIR}. (1) verwendet jedoch aufgrund eines Fehlers s_clientnicht die Standardeinstellung (Fix geplant ab Apr. 2015), die (2) dieses OP ohnehin nicht ändern wollte.
Dave_thompson_085