Extrahieren der Stammzertifizierungsstelle und der untergeordneten Zertifizierungsstelle aus einer Zertifikatkette unter Linux

25

Ich habe ein End-Entity / Server-Zertifikat, das ein Zwischen- und Root-Zertifikat hat. Wenn ich catauf dem Endentitätszertifikat bin, sehe ich nur ein einzelnes BEGINund ein ENDTag. Es ist das einzige Endgerätezertifikat.

Kann ich den Inhalt des Zwischenzertifikats und des Stammzertifikats auf irgendeine Weise anzeigen? Ich brauche nur den Inhalt von BEGINund ENDtag.

In Windows kann ich die vollständige Zertifizierungskette aus dem "Zertifizierungspfad" sehen. Unten sehen Sie das Beispiel für das Zertifikat von Stack Exchange.

Bildbeschreibung hier eingeben

Von dort aus kann ich ein Zertifikat anzeigen und exportieren. Ich kann das sowohl für root als auch für Intermediate unter Windows tun. Ich suche nach der gleichen Methode in Linux.

Bildbeschreibung hier eingeben

Anirban Nag 'tintinmj'
quelle
Bitte teilen Sie uns mit, wer Ihnen dieses Zertifikat ausgestellt hat.
Rui F Ribeiro
@RuiFRibeiro Sagen wir, jeder ... Ich möchte die Zertifikatskette für den Stapelaustausch nur mit dem Primärzertifikat in der Hand sehen.
Anirban Nag 'tintinmj'

Antworten:

25

Auf einer Website können Sie Folgendes tun:

openssl s_client -showcerts -verify 5 -connect stackexchange.com:443 < /dev/null

Daraufhin werden die Zertifikatskette und alle vom Server präsentierten Zertifikate angezeigt.

Wenn ich diese beiden Zertifikate in Dateien speichere, kann ich Folgendes verwenden openssl verify:

$ openssl verify -show_chain -untrusted dc-sha2.crt se.crt 
se.crt: OK
Chain:
depth=0: C = US, ST = NY, L = New York, O = "Stack Exchange, Inc.", CN = *.stackexchange.com (untrusted)
depth=1: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert SHA2 High Assurance Server CA (untrusted)
depth=2: C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert High Assurance EV Root CA

Mit dieser -untrustedOption werden die Zwischenzertifikate ausgegeben. se.crtist das zu überprüfende Zertifikat. Das Ergebnis depth = 2 stammt aus dem vertrauenswürdigen CA-Speicher des Systems.

Wenn Sie nicht über die Zwischenzertifikate verfügen, können Sie die Überprüfung nicht durchführen. So funktioniert X.509.

Abhängig vom Zertifikat kann es einen URI enthalten, von dem das Zwischenprodukt abgerufen werden kann. Als Beispiel openssl x509 -in se.crt -noout -textenthält:

        Authority Information Access: 
            OCSP - URI:http://ocsp.digicert.com
            CA Issuers - URI:http://cacerts.digicert.com/DigiCertSHA2HighAssuranceServerCA.crt

Dieser URI "CA Issuers" verweist auf das Zwischenzertifikat (im DER-Format, sodass Sie openssl x509 -inform der -in DigiCertSHA2HighAssuranceServerCA.crt -out DigiCertSHA2HighAssuranceServerCA.pemes zur weiteren Verwendung durch OpenSSL konvertieren müssen).

Wenn Sie ausführen, erhalten openssl x509 -in /tmp/DigiCertSHA2HighAssuranceServerCA.pem -noout -issuer_hashSie 244b5494, nach was Sie im Stammzertifizierungsstellenspeicher des Systems suchen können /etc/ssl/certs/244b5494.0(fügen Sie einfach .0den Namen hinzu).

Ich glaube nicht, dass es einen netten, einfachen OpenSSL-Befehl gibt, der das alles für Sie erledigt.

derobert
quelle
Das ist das Hauptproblem. Ich habe die URL nicht dabei. Ich habe nur die Zertifikatsdatei. Und ich brauche den verschlüsselten Inhalt zwischen BEGINund ENDtag (den Sie erhalten, nachdem catSie die .crt-Datei heruntergeladen haben.
Anirban Nag 'tintinmj'
Wenn Sie @ AnirbanNag'tintinmj‘sind nur das Zertifikat der Suche zu entschlüsseln versuchenopenssl x509 -in file.crt -noout -text
Derobert
Ich möchte den Inhalt von Intermediate bei Root-Zertifikat, das zwischen dem Tag BEGINund ist END.
Anirban Nag 'tintinmj'
Oder wenn Sie einen Befehl geben können, der das Zwischen- und Stammzertifikat aus dem Primärzertifikat extrahiert und dieses in einer Datei speichert ... damit kann ich auch leben.
Anirban Nag 'tintinmj'
@ AnirbanNag'tintinmj 'Wenn der openssl x509Befehl nicht angezeigt wird, glaube ich nicht, dass das Zwischenzertifikat vorhanden ist. (Es sei denn, Sie haben einen Fehler von openssl x509).
Derobert
12

tl; dr - Ein-Liner-Bash-Zauber, um alle Zertifikate in der Kette abzulegen

openssl s_client -showcerts -verify 5 -connect de.wikipedia.org:443 < /dev/null | awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".crt"; print >out}' && for cert in *.crt; do newname=$(openssl x509 -noout -subject -in $cert | sed -n 's/^.*CN=\(.*\)$/\1/; s/[ ,.*]/_/g; s/__/_/g; s/^_//g;p').pem; mv $cert $newname; done

Erklärung in 2 Schritten

So legen Sie alle Zertifikate in der Kette in das aktuelle Verzeichnis ab cert${chain_number}.pem:

openssl s_client -showcerts -verify 5 -connect your_host:443 < /dev/null | awk '/BEGIN/,/END/{ if(/BEGIN/){a++}; out="cert"a".pem"; print >out}' 

Bonus-Track, um sie in ihren gemeinsamen Namen umzubenennen:

for cert in *.pem; do newname=$(openssl x509 -noout -subject -in $cert | sed -n 's/^.*CN=\(.*\)$/\1/; s/[ ,.*]/_/g; s/__/_/g; s/^_//g;p').pem; mv $cert $newname; done
estani
quelle
Gibt es einen Grund, ".pem" gegen ".crt" als Erweiterung zu wählen, da Sie sie nur umbenennen, nicht aber das Format ändern?
Captain Man
Nein nicht wirklich. ".pem" ist das Format (base64 des DER) ".crt" bedeutet, dass es sich um ein Zertifikat handelt, aber nichts über die Codierung aussagt. Ich wollte es konsistenter machen und alle pem benennen ... Aber ich denke, es ist einfacher, in der einen Zeile zu lesen, um zu verstehen, wo das Zertifikat heruntergeladen wird (crt) und zu beenden, was ich normalerweise in der Linux-Welt verwende (pem). . Hoffe, das klärt die Dinge ein bisschen ...
estani
1
Ja, mir ist klar, dass PEM ein Format ist, aber ich sehe oft CRT und war mir nicht sicher, ob es ein Format ist. Dies hilft tatsächlich zu erklären, warum ich sehe, dass "CRT" so oft verwendet wird. Danke :)
Captain Man
Dies scheint nur zu funktionieren, wenn Sie der Quelle bereits vertrauen. Ich versuche, eine benutzerdefinierte Zertifizierungsstelle herunterzuladen, aber es wird nur das erste Zertifikat heruntergeladen, nicht die Kette.
Mjaggard
@mjaggard seltsam, da ich es genau für diesen Fall verwendet habe. Davon abgesehen sendet der Server möglicherweise überhaupt nicht die Stammzertifizierungsstelle. Wenn Sie sich mein Beispiel ansehen, wurden 3 Zertifikate heruntergeladen, jetzt werden nur 2 heruntergeladen Punkt, wenn Sie es nicht haben, werden Sie es sowieso nicht vertrauen ...). Ich bin mir ziemlich sicher, dass das vorher nicht der Fall war.
Estani