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.

30voto

kenorb Punkte 134883

Um das Zertifikat des entfernten Servers zu erhalten, können Sie Folgendes verwenden openssl und Sie können es finden zwischen BEGIN CERTIFICATE y END CERTIFICATE die Sie kopieren und in Ihre Zertifikatsdatei (CRT) einfügen müssen.

Hier ist der Befehl zur Demonstration:

ex +'/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq > file.crt

Um alle Zertifikate aus der Kette zurückzugeben, fügen Sie einfach g (global) wie:

ex +'g/BEGIN CERTIFICATE/,/END CERTIFICATE/p' <(echo | openssl s_client -showcerts -connect example.com:443) -scq

Dann können Sie einfach Ihre Zertifikatsdatei importieren ( file.crt ) in Ihren Schlüsselbund und machen ihn vertrauenswürdig, so dass Java sich nicht beschweren sollte.

Unter OS X können Sie auf die Datei doppelklicken oder sie per Drag & Drop in Ihren Schlüsselbund ziehen, damit sie unter Anmeldung/Zertifikate erscheint. Dann doppelklicken Sie auf das importierte Zertifikat und machen es Immer Vertrauen für SSL .

Unter CentOS 5 können Sie sie in /etc/pki/tls/certs/ca-bundle.crt Datei (und führen: sudo update-ca-trust force-enable ), oder in CentOS 6 kopieren Sie sie nach /etc/pki/ca-trust/source/anchors/ und laufen sudo update-ca-trust extract .

Unter Ubuntu kopieren Sie sie nach /usr/local/share/ca-certificates und laufen sudo update-ca-certificates .

14voto

akond Punkte 15345
HOST=gmail-pop.l.google.com
PORT=995

openssl s_client -servername $HOST -connect $HOST:$PORT < /dev/null 2>/dev/null | openssl x509 -outform pem

10voto

Um nur die Zertifikatskette und nicht das Zertifikat des Servers zu drucken:

# MYHOST=myhost.com
# MYPORT=443
# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk '/^.*'"${MYHOST}"'/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}'

zur Aktualisierung des CA-Vertrauens auf CentOS/RHEL 6/7 :

# update-ca-trust enable
# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk '/^.*'"${MYHOST}"'/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}' >/etc/pki/ca-trust/source/anchors/myca.cert
# update-ca-trust extract

auf CentOS/RHEL 5:

# openssl s_client -connect ${MYHOST}:${MYPORT} -showcerts 2>/dev/null </dev/null | awk '/^.*'"${MYHOST}"'/,/-----END CERTIFICATE-----/{next;}/-----BEGIN/,/-----END CERTIFICATE-----/{print}' >>/etc/pki/tls/certs/ca-bundle.crt

0 Stimmen

Genau das, was ich unter CentOS7 brauchte. Danke!

10voto

Hakan54 Punkte 2111

Ich hatte auch das gleiche Problem, und außerdem habe ich entdeckt, dass openssl die Root ca. nicht zurückgibt. Ich habe speziell für diesen Zweck eine Alternative entwickelt, die für andere Entwickler nützlich sein könnte, siehe hier: GitHub - Zertifikat-Ripper

Verwendung

0 Stimmen

Ziemlich nützliches Tool! Können wir irgendwie die Zieldatei für den Export angeben? Ich denke da an den Pfad und das Format. Danke

0 Stimmen

Ich war gerade dabei, diese Option hinzuzufügen, aber wie ich sehe, hast du sie bereits hinzugefügt - vielen Dank dafür! :)

1 Stimmen

Ja, ich habe sie hinzugefügt und heute veröffentlicht. Danke, dass Sie diese Idee erwähnt haben. Es war gut, diese Option in der App zu haben.

8voto

JuanMoreno Punkte 2021

Wenn Ihr Server ein E-Mail-Server ist (MS Exchange oder Zimbra), müssen Sie vielleicht die starttls y smtp Flaggen:

openssl s_client -starttls smtp -connect HOST_EMAIL:SECURE_PORT 2>/dev/null </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > CERTIFICATE_NAME.pem

Wo,

  • HOST_EMAIL ist die Server-Domäne, zum Beispiel mail-server.com.

  • SICHERER_PORT ist der Kommunikationsanschluss, z. B. 587 oder 465

  • ZERTIFIKAT_NAME den Dateinamen der Ausgabe (BASE 64/PEM Format)

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