Ich habe eine SSL-CRT-Datei im PEM-Format. Gibt es eine Möglichkeit, den allgemeinen Namen (Common Name, CN) aus dem Zertifikat über die Befehlszeile zu extrahieren?
Ich habe eine SSL-CRT-Datei im PEM-Format. Gibt es eine Möglichkeit, den allgemeinen Namen (Common Name, CN) aus dem Zertifikat über die Befehlszeile zu extrahieren?
Antworten:
Wenn Sie openssl
installiert haben, können Sie Folgendes ausführen:
openssl x509 -noout -subject -in server.pem
openssl x509 -noout -subject -in server.pem | sed -n '/^subject/s/^.*CN=//p'
sed -e 's/^subject.*CN=\([a-zA-Z0-9\.\-]*\).*$/\1/'
, um gerade die Domain zu erhalten, da ich zusätzliche Details nach dem CN hatte. Sein nicht super strenges Matching für eine gültige CN aber in den meisten Fällen funktioniert es, könnten Sie mehr schlaff und ersetzen sein [a-zA-Z0-9\.\-]
mit , [^/]
aber ich bin nicht sicher , dass immer funktionieren wird.
\*
, was @flungo zur Unterstützung von Wildcard-Domains verwendet hat: sed -e 's/^subject.*CN=\([a-zA-Z0-9\.\-\*]*\).*$/\1/'
( [^/]
funktioniert in meinem Fall jedoch)
sed
oben vorgeschlagenen Befehle funktionieren nicht, wenn für das Zertifikat Relative Distinguished Names (RDNs) nach dem Common Name (CN) angegeben sind, z. B. OU (OrganizationalUnit) oder C (Country). Eine Möglichkeit für solche Fälle bieten würde eine zusätzliche sein sed
: openssl x509 -noout -subject -in server.pem | sed 's/^.*CN=//' | sed sed 's/\/.*$//'
.
openssl x509 -noout -subject -nameopt multiline | grep commonName
| sed -n 's/ *commonName *= //p'
certtool -i < whatever.pem | egrep "^\s+Subject:"
Beachten Sie, dass die Datei über zur Standardeingabe geleitet wird <
und nicht als Argument verwendet wird. In egrep
diesem Fall wird das gesamte Zertifikat ausgedruckt, aber der CN befindet sich im Subject:
Feld ganz oben (achten Sie darauf, dass im Issuer:
Feld auch ein CN-Wert angegeben ist).
X.509 Certificate Information:
Version: 3
Serial Number (hex): 01
Issuer: [...] CN=unixandlinux.ex <- Not this one.
Validity: ...
Subject: CN=goldilocks
certtool
ist Teil von gnutls, wenn es nicht installiert ist, suchen Sie danach. GnuTLS ist ein bisschen netter als OpenSSL, IMO.
gnutls-certtool
welches überbrew install gnutls
gnutls-bin
Ich fand die obige Antwort und fand sie sehr nützlich, fand aber auch, dass sich die certtool
Befehlssyntax (unter Ubuntu Linux heute) merklich von der von goldilocks beschriebenen unterscheidet, ebenso wie die Ausgabe. Daher hielt ich es für das Beste, diese ausgezeichnete Antwort mit der "heutigen Version" zu aktualisieren.
Die "i"
Option (jetzt?) Steht für "importieren", entsprechend man certtool
, so dass der richtige Befehl "d"
"anzeigen" zu sein scheint . Also, dieser Befehl:
certtool d myfoo.crt
(Die Dateierweiterung in meinem Fall ist einfach .crt
nicht .pem
... das ist nicht relevant.)
... erzeugt eine Ausgabe, die im relevanten Teil so aussieht:
Common Name : Foobar
Ohne Frage hatte Goldlöckchen Recht: Die certtool
Ausgabe ist viel einfacher zu bearbeiten als openssl
in diesem Fall.
certtool
, die Optionen ohne die üblichen Operatoren ( -
oder --
) hat, und man certtool
für v. 3.5.8 (debian), 3.5.16 (fedora, die einzige Version danach im Upstream-Stable-Zweig ist 3.5.17 von (vor einem Monat), die Online-Dokumentation von GnuTLS und die Online-Manpage für Ubuntu 17.10 (dieselbe Version wie das aktuelle Debian) beziehen sich alle auf: