OpenSSL Überprüfen Sie den Rückkehrcode: 20 (lokales Ausstellerzertifikat kann nicht abgerufen werden)

75

Ich verwende Windows Vista und versuche, über https eine Verbindung herzustellen, um eine Datei in einer mehrteiligen Form hochzuladen, habe jedoch Probleme mit dem lokalen Ausstellerzertifikat. Ich versuche nur herauszufinden, warum dies jetzt nicht funktioniert, und später zu meinem cURL-Code zurückzukehren, nachdem dies ausgearbeitet wurde. Ich führe den Befehl aus:

openssl s_client -connect connect_to_site.com:443

Es gibt mir ein digitales Zertifikat von VeriSign, Inc., aber es gibt auch einen Fehler aus:

Verify return code: 20 (unable to get local issuer certificate)

Was ist das lokale Ausstellerzertifikat? Ist das ein Zertifikat von meinem eigenen Computer? Gibt es einen Weg, dies zu umgehen? Ich habe versucht, die Datei -CAfile mozilla.pem zu verwenden, erhalte aber immer noch den gleichen Fehler.

bryan sammon
quelle
Stack Overflow ist eine Site für Programmier- und Entwicklungsfragen. Diese Frage scheint nicht zum Thema zu gehören, da es nicht um Programmierung oder Entwicklung geht. Weitere Informationen zu den Themen finden Sie hier in der Hilfe. Vielleicht ist Unix & Linux Stack Exchange oder Information Security Stack Exchange ein besserer Ort, um nachzufragen.
JWW
Wie lautet die URL für die Site? Keine der Antworten ist zu beeindruckend, aber sie können die Frage nicht beantworten, da Sie wichtige Details wie den Servernamen redigiert haben. Auch connect_to_site.comist (oder kann) eine echte Website. Sie sollten verwenden, example.comda IANA es für diesen Zweck reserviert.
JWW
@jww nein kann es nicht, Unterstriche sind in Domainnamen nicht gültig.
Doktor J
@DoktorJ - Unterstriche in Domainnamen sind in Ordnung, während Unterstriche in Hostnamen früher verboten waren. connect_to_site.comist ein Domainname, kein Hostname. Ich weiß nicht, ob IDNA Unterstriche in Hostnamen zulässt. Siehe auch Können Subdomains (Domainnamen) einen Unterstrich "_" enthalten? .
JWW

Antworten:

92

Ich hatte das gleiche Problem und löste es, indem ich den Pfad an ein Verzeichnis übergab, in dem CA-Schlüssel gespeichert sind. Unter Ubuntu war es:

openssl s_client -CApath /etc/ssl/certs/ -connect address.com:443
Jan Wrobel
quelle
1
Dieses Problem wird im Ubuntu-Fehler # 396818 behandelt .
Håkon A. Hjortland
1
Ich danke dir sehr! Das war einfach großartig, dies war der zweite Tag, an dem ich nachgeschlagen habe und in den Wahnsinn geriet. Ich habe sogar einen anderen Server für meine Anwendung erstellt (einen bei DigitalOcean und einen bei Amazon). Danke noch einmal. Prost.
Felipe
3
Sie können auch den Pfad festlegen /dev/null, damit Ihr Kunde an allen üblichen Stellen selbst nach den Zertifikaten sucht.
Mulllhausen
1
Beachten Sie, dass dieser Pfad normalerweise vom Paket ausgefüllt wird ca-certificates.
Josip Rodin
16

Dieser Fehler tritt auch auf, wenn Sie ein selbstsigniertes Zertifikat verwenden, bei dem keyUsageder Wert fehlt keyCertSign.

Conrado
quelle
1
Ich habe Stunden damit verbracht, dies aufzuspüren. Vielen Dank!
Nathan Moinvaziri
Ich habe gerade versucht, sogar das Zertifikat der Zertifizierungsstelle mit Verwendung: keyCertSign, das Problem ist das gleiche. Es scheint, dass das CA-Zertifikat oder das Stammzertifikat zur certsDB von openssl (/etc/ssl/certs/ca-certificates.crt) hinzugefügt werden sollte
user1462586
Dieses Problem wurde heute in OpenSSL behoben (siehe github.com/openssl/openssl/issues/1418 ) und das Update sollte bald verfügbar sein.
dvo
12

Lösung: Sie müssen den Parameter explizit hinzufügen -CAfile your-ca-file.pem.

Hinweis: Ich habe auch den -CApathin anderen Antworten erwähnten Parameter ausprobiert , funktioniert aber bei mir nicht.

Erläuterung: Fehler unable to get local issuer certificatebedeutet, dass der opensslIhr Stammzertifizierungsstellenzertifikat nicht kennt.


Hinweis: Wenn Sie einen Webserver mit mehr Domänen haben , vergessen Sie nicht, auch -servername your.domain.netParameter hinzuzufügen . Dieser Parameter wird "TLS-Erweiterungsservername in ClientHello festlegen". Ohne diesen Parameter enthält die Antwort immer das Standard-SSL-Zertifikat (kein Zertifikat, das mit Ihrer Domain übereinstimmt).

Martin
quelle
Vielen Dank, ich bin schon seit Stunden dabei. Nichts hat funktioniert, aber das !!
Ayush
3

Ist Ihr Server für die Clientauthentifizierung konfiguriert? In diesem Fall müssen Sie das Client-Zertifikat übergeben, während Sie eine Verbindung zum Server herstellen.

Sivachandran
quelle
3

Ich hatte das gleiche Problem unter OSX OpenSSL 1.0.1i von Macports und musste CApath als Problemumgehung angeben (und wie im Ubuntu-Fehlerbericht erwähnt, lässt sogar ein ungültiger CApath openssl im Standardverzeichnis aussehen). Interessanterweise funktionierte die Verbindung mit demselben Server mithilfe der OpenSL-Funktionen von PHP (wie in PHPMailer 5 verwendet) einwandfrei.

Brophy
quelle
2

Mit Client-Authentifizierung:

openssl s_client -cert ./client-cert.pem -key ./client-key.key -CApath /etc/ssl/certs/ -connect foo.example.com:443
toppur
quelle
2

Legen Sie Ihre Zertifizierungsstelle und Ihr Stammzertifikat in / usr / share / ca-Zertifikat oder / usr / local / share / ca-Zertifikat ab. Dann

dpkg-Rekonfigurieren von CA-Zertifikaten

oder installieren Sie das ca-Zertifikat-Paket sogar mit apt-get neu.

Danach wird Ihr Zertifikat in der Datenbank des Systems gesammelt: /etc/ssl/certs/ca-certificates.crt

Dann sollte alles in Ordnung sein.

user1462586
quelle
Ich frage mich, ob Windows einen Ordner / usr / share / ca-Zertifikat oder / usr / local / share / ca-Zertifikat hat. Und was würde dpkg-Rekonfiguration in Windows-Begriffen bedeuten?
Harald Coppoolse
In Windows würden Sie das Zertifikat in den Zertifikatspeicher des lokalen Computers stellen. Führen Sie mmc.exe aus und fügen Sie Snapin hinzu> Zertifikate> lokaler Computer. Legen Sie dann alle Endentitätszertifikate in den Personal Store, Zwischenzertifikate in den Zwischenordner usw. usw.
Chuck Herrington
2

Erstellen Sie die Zertifikatskettendatei mit dem Zwischen- und Stammverzeichnis.

cat intermediate/certs/intermediate.cert.pem certs/ca.cert.pem > intermediate/certs/ca-chain.cert.pem

chmod 444 intermediate/certs/ca-chain.cert.pem

Dann überprüfen

openssl verify -CAfile intermediate/certs/ca-chain.cert.pem \
  intermediate/certs/www.example.com.cert.pem

www.example.com.cert.pem: OK Stellen Sie das Zertifikat bereit

Sanjay
quelle
Bitte
1

Ich hatte das gleiche Problem: Es wurde behoben, nachdem der Betreff des Ausstellers im Zertifikat beibehalten wurde, da es als Betreff des Ausstellerzertifikats gilt.

Aktivieren Sie daher bitte "Betreff des Ausstellers im Zertifikat (cert.pem) == Betreff des Ausstellers (CA.pem)".

openssl verify -CAfile CA.pem cert.pem
cert.pem: OK

Harikumar Pondreti
quelle
0

Diese Fehlermeldung bedeutet, dass CABundle nicht von (-CAfile ...) angegeben wird ODER die CABundle-Datei nicht von einem selbstsignierten Stammzertifikat geschlossen wird.

Mach dir keine Sorgen. Die Verbindung zum Server funktioniert auch dann, wenn Sie diese Nachricht von openssl s_client erhalten ... (vorausgesetzt, Sie machen auch keinen anderen Fehler)

Pal Sonkoly
quelle