494 Stimmen

openssl verwenden, um das Zertifikat von einem Server zu erhalten

Ich versuche, das Zertifikat eines entfernten Servers zu erhalten, das ich dann zu meinem Keystore hinzufügen und in meiner Java-Anwendung verwenden kann.

Ein erfahrener Entwickler (der gerade im Urlaub ist :( ) hat mich informiert, dass ich dies tun kann:

openssl s_client -connect host.host:9999

um ein Rohzertifikat auszugeben, das ich dann kopieren und exportieren kann. Ich erhalte die folgende Ausgabe:

depth=1 /C=NZ/ST=Test State or Province/O=Organization Name/OU=Organizational Unit Name/CN=Test CA
verify error:num=19:self signed certificate in certificate chain
verify return:0
23177:error:14094410:SSL routines:SSL3_READ_BYTES:sslv3 alert handshake failure:s3_pkt.c:1086:SSL alert number 40
23177:error:140790E5:SSL routines:SSL23_WRITE:ssl handshake failure:s23_lib.c:188:

Ich habe es auch mit dieser Option versucht:

-showcerts

und dieses hier (unter Debian wohlgemerkt):

-CApath /etc/ssl/certs/

Aber ich erhalte den gleichen Fehler.

Diese Quelle sagt, dass ich das CApath-Flag verwenden kann, aber es scheint nicht zu helfen. Ich habe mehrere Pfade ausprobiert, ohne Erfolg.

Bitte teilen Sie mir mit, was ich falsch mache.

636voto

Ari Maniatis Punkte 7360

Mit SNI

Wenn der Remote-Server SNI verwendet (d. h. mehrere SSL-Hosts auf einer einzigen IP-Adresse), müssen Sie den richtigen Hostnamen senden, um das richtige Zertifikat zu erhalten.

openssl s_client -showcerts -servername www.example.com -connect www.example.com:443 </dev/null

Ohne SNI

Wenn der entfernte Server kein SNI verwendet, können Sie die folgenden Schritte überspringen -servername Parameter:

openssl s_client -showcerts -connect www.example.com:443 </dev/null

Sie können auch diese Befehlskette verwenden, um die vollständigen Details des Zertifikats einer Website anzuzeigen:

$ echo | \
    openssl s_client -servername www.example.com -connect www.example.com:443 2>/dev/null | \
    openssl x509 -text

3 Stimmen

Hm. Ich erhalte immer noch die gleiche Fehlermeldung, wenn ich diesen Befehl ausprobiere. Ich habe festgestellt, dass meine Openssl-Version "OpenSSL 0.9.8g 19 Oct 2007" lautet. Haben Sie eine Idee?

48 Stimmen

Nützlich: echo "" | openssl s_client -connect server:port -prexit 2>/dev/null | sed -n -e '/BEGIN\ CERTIFICATE/,/END\ CERTIFICATE/ p' stackoverflow.com/a/12918442/843000

23 Stimmen

Alternatives nützliches Skript, von madboa.de : echo | openssl s_client -connect server:port 2>&1 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > cert.pem

107voto

André Fernandes Punkte 1967

Ein Einzeiler, um das Zertifikat von einem entfernten Server im PEM-Format zu extrahieren, dieses Mal mit sed :

openssl s_client -connect www.google.com:443 2>/dev/null </dev/null |  sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'

4 Stimmen

Dieser ist fast perfekt, um die Bescheinigung zu extrahieren, es fehlt nur die -servername Ich weiß nicht warum, aber ich musste diese Option nutzen, um das vollständige Zertifikat zu erhalten.

1 Stimmen

-servername ist für die Angabe des Servernamens (SNI) erforderlich. Die Websuche kann den Rest ergänzen.

77voto

David Jaquay Punkte 1004

Ich stimme zwar mit Aris Antwort überein (und habe sie hochgestuft :), aber ich musste einen zusätzlichen Schritt tun, damit es mit Java unter Windows funktioniert (wo es eingesetzt werden musste):

openssl s_client -showcerts -connect www.example.com:443 < /dev/null | openssl x509 -outform DER > derp.der

Vor dem Hinzufügen der openssl x509 -outform DER Konvertierung erhielt ich eine Fehlermeldung von keytool unter Windows, die sich über das Format des Zertifikats beschwerte. Das Importieren der .der-Datei funktionierte problemlos.

0 Stimmen

Seltsam. Ich verwende PEM-Zertifikate mit keytool unter Windows seit Java 6 und hatte noch nie ein Problem.

43voto

nasty pasty Punkte 6006

Es stellt sich heraus, dass es hier mehr Komplexität gibt: Ich musste viel mehr Details angeben, um die Sache ins Rollen zu bringen. Ich denke, es hat etwas mit der Tatsache zu tun, dass es sich um eine Verbindung handelt, die eine Client-Authentifizierung benötigt, und dass der Hankshake mehr Informationen benötigte, um bis zu der Phase fortzufahren, in der die Zertifikate ausgegeben wurden.

Hier ist mein Arbeitsbefehl:

openssl s_client -connect host:port -key our_private_key.pem -showcerts \
                 -cert our_server-signed_cert.pem

Hoffentlich ist dies ein Anstoß in die richtige Richtung für alle, die mehr Informationen brauchen.

6 Stimmen

Es tut mir leid, aber Ihre Antwort ergibt nicht viel Sinn. Sie mussten das Zertifikat an den Server weitergeben, um das Zertifikat zu erhalten?

3 Stimmen

Ja, das stimmt. Client-Authentifizierung AFAIK.

13 Stimmen

Es stellt sich heraus, dass '-prexit' diese Daten ebenfalls zurückgibt. Z.B.; openssl s_client -connect host:port -prexit

39voto

Florian Punkte 2902

Die einfachste Befehlszeile hierfür, die sowohl die PEM-Ausgabe zum Hinzufügen zum Keystore als auch eine menschenlesbare Ausgabe enthält und auch SNI unterstützt, was wichtig ist, wenn Sie mit einem HTTP-Server arbeiten, ist

openssl s_client -servername example.com -connect example.com:443 \
    </dev/null 2>/dev/null | openssl x509 -text

El -Servername wird die SNI-Unterstützung aktiviert und die openssl x509 -text druckt das Zertifikat in menschenlesbarem Format.

0 Stimmen

Sie können dem -servername Ihre Subdomäne hinzufügen, z. B. ws.example.com statt example.com (dies gilt auch für den Parameter -connect).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X