it-swarm.com.de

Verwenden Sie openssl, um das Zertifikat von einem Server abzurufen

Ich versuche, das Zertifikat eines Remoteservers abzurufen, mit dem ich es meinem Keystore hinzufügen und in meiner Anwendung Java verwenden kann.

Ein leitender Entwickler (der im Urlaub ist :() hat mir mitgeteilt, dass ich Folgendes ausführen kann:

openssl s_client -connect Host.host:9999

Um ein Rohzertifikat raus zu bekommen, das ich dann kopieren und exportieren kann. Ich erhalte 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 (läuft auf debian wohlgemerkt)

-CApath /etc/ssl/certs/ 

Aber bekomme den gleichen Fehler.

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

Bitte lassen Sie mich wissen, wo ich falsch liege.

306
nasty pasty

Es stellt sich heraus, dass hier mehr Komplexität vorhanden ist: Ich musste viel mehr Details bereitstellen, um dies ins Rollen zu bringen. Ich denke, es hat etwas mit der Tatsache zu tun, dass es sich um eine Verbindung handelt, die eine Clientauthentifizierung benötigt, und der Hankshake benötigte weitere Informationen, um bis zu dem Stadium fortzufahren, in dem die Zertifikate gesichert 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 gebrauchen können.

38
nasty pasty

Mit SNI

Wenn der Remote-Server SNI verwendet (dh mehrere SSL-Hosts auf einer einzigen IP-Adresse gemeinsam nutzen), 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 Remote-Server kein SNI verwendet, können Sie den Parameter -servername überspringen:

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


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

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

Obwohl ich der Antwort von Ari zustimme (und sie hochgestuft habe :), musste ich einen zusätzlichen Schritt tun, damit sie unter Windows mit Java funktioniert (wo sie bereitgestellt 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, in der ich mich über das Format des Zertifikats beschwerte. Das Importieren der .der-Datei hat problemlos funktioniert.

66
David Jaquay

Die einfachste Befehlszeile hierfür, die die PEM-Ausgabe zum Hinzufügen zum Keystore sowie eine von Menschen lesbare Ausgabe enthält und auch SNI unterstützt, ist:

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

Mit der Option - Servername wird die SNI-Unterstützung aktiviert, und mit openssl x509 -text wird das Zertifikat in einem für Menschen lesbaren Format gedruckt.

32
Florian

Ein Einzeiler zum Extrahieren des Zertifikats von einem Remote-Server im PEM-Format, diesmal mit sed:

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

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

Hier ist der Befehl, der dies demonstriert:

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

Fügen Sie einfach g (global) hinzu, um alle Zertifikate aus der Kette zurückzugeben:

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

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

Unter OS X können Sie auf die Datei doppelklicken oder sie in Ihren Schlüsselbund ziehen und dort ablegen, damit sie unter Login/Zertifikate angezeigt wird. Doppelklicken Sie dann auf das importierte Zertifikat und machen Sie es Immer für SSL vertrauen.

Unter CentOS 5 können Sie sie in die Datei /etc/pki/tls/certs/ca-bundle.crt anhängen (und ausführen: Sudo update-ca-trust force-enable) oder in CentOS 6 in die Datei /etc/pki/ca-trust/source/anchors/ kopieren und Sudo update-ca-trust extract ausführen.

Kopiere sie in Ubuntu in /usr/local/share/ca-certificates und führe Sudo update-ca-certificates aus.

23
kenorb
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
8
akond

Sie können das Server-Stammzertifikat mit dem nächsten Bash-Skript abrufen und speichern:

CERTS=$(echo -n | openssl s_client -connect $Host_NAME:$PORT -showcerts | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p')
echo "$CERTS" | awk -v RS="-----BEGIN CERTIFICATE-----" 'NR > 1 { printf RS $0 > "'$SERVER_ROOT_CERTIFICATE'"; close("'$SERVER_ROOT_CERTIFICATE'") }'

Überschreiben Sie einfach die erforderlichen Variablen.

4

so drucken Sie nur die Zertifikatskette und nicht das Serverzertifikat:

# 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}'

so aktualisieren Sie die CA-Vertrauenswürdigkeit unter 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
4

Wenn Ihr Server ein E-Mail-Server ist (MS Exchange oder Zimbra), müssen Sie möglicherweise die Flags starttls und smtp hinzufügen:

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 Serverdomäne, zum Beispiel mail-server.com.

  • SECURE_PORT ist der Kommunikationsport, z. B. 587 oder 465

  • CERTIFICATE_NAME Dateiname der Ausgabe (BASE 64/PEM-Format)

1
SHoko

Für andere wie mich, die beim Zugriff auf AWS CloudFront versucht haben, den guten Rat zu befolgen, besteht der Trick darin, -servername domain.name.. hinzuzufügen.

Quelle: https://serverfault.com/a/780450/8972

1
Amos Shapira