SSL-Zertifikatfehler: Überprüfungsfehler: num = 20: Lokales Ausstellerzertifikat kann nicht abgerufen werden

11

Ich habe versucht, eine SSL-Verbindung zu einem LDAPS-Server (Active Directory) herzustellen, habe aber weiterhin Probleme. Ich habe versucht, dies zu verwenden:

openssl s_client -connect the.server.edu:3269 

Mit folgendem Ergebnis:

verify error:num=20:unable to get local issuer certificate 

Ich dachte, OK, der Server ist ein alter Produktionsserver, der ein paar Jahre alt ist. Vielleicht ist die CA nicht vorhanden. Ich habe dann das Zertifikat von der Ausgabe in eine PEM-Datei gezogen und versucht:

openssl s_client -CAfile mycert.pem -connect the.server.edu:3269

Und das hat auch nicht funktioniert.

Was vermisse ich? Sollte das nicht IMMER funktionieren?


quelle
Aus Gründen der Klarheit scheint es, dass LDAPS, wenn es von Windows bereitgestellt wird, das CA-Zertifikat nicht anzeigt, wenn eine Verbindung hergestellt wird. Daher sollten Sie das CA X.509-Zertifikat erhalten, als base64 exportieren und wie in den folgenden Antworten beschrieben zuweisen. In meinem Fall weisen Sie es mit python-ldap im GLOBAL-Bereich (nicht in Ihrer ldap.initialize () -Instanz) wie folgt zu: ldap.set_option(ldap.OPT_X_TLS_CACERTFILE,'./ca_issuer_cert.pem') Danach konnte ich STARTTLS (innerhalb von LDAP-Port 389) wie erwartet verwenden.
mbrownnyc

Antworten:

4

Das sehe ich also als CA-Zertifikatsnamen:

depth=1 /C=US/O=VeriSign, Inc./OU=VeriSign Trust Network/OU=Terms of use at //www.verisign.com/rpa (c)10/CN=VeriSign Class 3 International Server CA - G3
verify error:num=20:unable to get local issuer certificate
verify return:0

Das war der Name des Zertifikats, das ich importiert hatte, nachdem ich die Showshows in meinem zweiten Versuch oben gemacht hatte. Ich habe die Zertifikate im Keystore folgendermaßen aufgelistet:

$JAVA_HOME/bin/keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacerts

Ich sehe dort das CA-Zertifikat.

Alias name: versign2006
Creation date: Jan 21, 2011
Entry type: trustedCertEntry

Owner: CN=VeriSign Class 3 International Server CA - G3, OU=Terms of use at www.verisign.com/rpa (c)10, OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US
Issuer: CN=VeriSign Class 3 Public Primary Certification Authority - G5, OU="(c) 2006 VeriSign, Inc. - For authorized use only", OU=VeriSign Trust Network, O="VeriSign, Inc.", C=US
Serial number: 641be820ce020813f32d4d2d95d67e67
Valid from: Sun Feb 07 19:00:00 EST 2010 until: Fri Feb 07 18:59:59 EST 2020
Certificate fingerprints:
  MD5:  BA:B0:65:B4:3B:9C:E8:40:30:21:7D:C5:C6:CD:3F:EB
  SHA1: B1:8D:9D:19:56:69:BA:0F:78:29:51:75:66:C2:5F:42:2A:27:71:04

Um sicherzustellen, dass openssl den Keystore verwendet, den ich mit dem Server verwende, verwende ich das Argument -CAfile:

openssl s_client -connect the.server.edu:3269 -CAfile $JAVA_HOME/jre/lib/security/cacerts

Da ich wusste, dass der Java-Keystore für Zertifizierungsstellen ein Kennwort hat, habe ich versucht, die Option -pass pass: password wie folgt zu verwenden:

openssl s_client -connect the.server.edu:3269 -CAfile $JAVA_HOME/jre/lib/security/cacerts -pass pass:changeit

aber das hat auch nicht funktioniert.

Das Lustige daran ist, dass die Cacerts-Datei ein Passwort enthält und openssl sich nicht darüber beschwert, dass die Cacerts-Datei nicht gelesen werden kann. Das kommt mir faul vor. Läutet das oder irgendetwas anderes eine Glocke?

Brian
quelle
3

Dieser Fehler lautet: "Ich kann der Zertifikatkette nicht zu einem vertrauenswürdigen Stamm folgen". Ich habe gerade den gleichen Befehl für meine eigenen AD-Server ausgeführt und erhalte eine vollständige Zertifikatskette, aber das oberste Zertifikat weist genau diesen Fehler auf. Wenn Sie den Pub-Schlüssel der Zertifizierungsstelle haben, die das Zertifikat signiert hat, können Sie ihn mit den Optionen -CAfileoder angeben-CApath

sysadmin1138
quelle
Ok, danke für die Antwort. Also habe ich das versucht. Erhalten Sie das CA-Zertifikat, indem Sie dasselbe mit aktivierter Option -showcerts tun, und greifen Sie zum anderen Zertifikat. Das sollte das CA-Zertifikat sein, oder? Versuchte das anstelle des Serverzertifikats in der PEM-Datei und bekam die gleiche Fehlermeldung. Irgendwelche anderen Gedanken?
In diesem Fall ist es wahrscheinlich, dass die Validierung aus einem anderen Grund fehlschlägt, z. B. weil sie abgelaufen ist.
sysadmin1138
1

Ich habe versucht, eine SSL-Verbindung zu einem LDAPS-Server (Active Directory) herzustellen, habe aber weiterhin Probleme. Ich habe versucht, dies zu verwenden:

Wenn Sie OpenLDAP verwenden, können Sie Folgendes festlegen:

TLS_REQCERT=never

in Ihrer openldap.confDatei, die OpenLDAP anweist, keine Zertifikatüberprüfung zu versuchen. Es gibt eine ähnliche Option, wenn Sie eine LDAP-Authentifizierung mit Apache durchführen.

Wenn Sie wirklich eine Zertifikatsüberprüfung durchführen möchten, kann Folgendes hilfreich sein:

Was vermisse ich? Sollte das nicht IMMER funktionieren?

Das glaube ich nicht. Während das Folgende definitiv klingt, ist es wirklich nur mein bester Gast:

Was Sie versucht haben, funktioniert nur für ein selbstsigniertes Zertifikat. Da das Zertifikat tatsächlich von der Windows-Zertifizierungsstelle ausgestellt wurde, erhalten Sie beim Versuch, das Serverzertifikat als Argument zu verwenden -CAfile, nichts.

Erhalten Sie das CA-Zertifikat, indem Sie dasselbe mit aktivierter Option -showcerts tun, und greifen Sie zum anderen Zertifikat. Das sollte das CA-Zertifikat sein, oder?

Nicht unbedingt, nein. Es gibt keine Garantie dafür, dass der Remote-Server das CA-Zertifikat in seiner Ausgabe präsentiert. Sie müssen sich zuerst den Aussteller des Serverzertifikats ansehen:

openssl x509 -in server.crt -noout -text | grep Issuer

... und dann prüfen, ob eines der anderen Zertifikate, die Sie haben, mit diesem Aussteller übereinstimmt.

Larsks
quelle