У меня есть файл SSL CRT в формате PEM. Есть ли способ, которым я могу извлечь общее имя (CN) из сертификата из командной строки?
У меня есть файл SSL CRT в формате PEM. Есть ли способ, которым я могу извлечь общее имя (CN) из сертификата из командной строки?
Ответы:
Если вы openssl
установили, вы можете запустить:
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/'
только домен, так как у меня были дополнительные подробности после CN. Его не очень строгое соответствие для действительного CN , но в большинстве случаев это работает, вы могли бы быть более вялым и заменить [a-zA-Z0-9\.\-]
с , [^/]
но я не уверен , что всегда будет работать.
\*
к тому, что @flungo использовал для поддержки доменов подстановки: sed -e 's/^subject.*CN=\([a-zA-Z0-9\.\-\*]*\).*$/\1/'
( [^/]
хотя в моем случае это работает)
sed
команды , предложенные выше , не будет работать , если сертификат имеет Относительные различающиеся имена (RDNS) , указанные после Common Name (CN), например , OU (OrganizationalUnit) или C (Страна). Один из способов удовлетворения таких случаев будет дополнительно 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:"
Обратите внимание, что это направляет файл на стандартный ввод через <
, а не использует его в качестве аргумента. Без egrep
этого будет распечатан весь сертификат, но CN находится в Subject:
поле рядом с верхом (будьте осторожны, есть также значение CN в Issuer:
поле).
X.509 Certificate Information:
Version: 3
Serial Number (hex): 01
Issuer: [...] CN=unixandlinux.ex <- Not this one.
Validity: ...
Subject: CN=goldilocks
certtool
является частью gnutls, если он не установлен, просто найдите его. GnuTLS немного лучше OpenSSL, IMO.
gnutls-certtool
который был установлен черезbrew install gnutls
gnutls-bin
Я нашел приведенный выше ответ и нашел его очень полезным, но я также обнаружил, что certtool
синтаксис команды (в Ubuntu Linux, сегодня) заметно отличался от описанного в goldilocks, как и вывод. Поэтому я подумал, что лучше дополнить этот превосходный ответ тем, что может быть «сегодняшней версией».
"i"
Вариант (теперь?) Означает «импорт» в соответствии с man certtool
, так что собственно команда , как представляется "d"
, «дисплей» . Итак, эта команда:
certtool d myfoo.crt
(Расширение файла в моем случае просто .crt
не .pem
... это не имеет значения.)
... производит вывод, который в соответствующей части выглядит следующим образом:
Common Name : Foobar
Несомненно, ленок был прав: certtool
выход гораздо проще проще работать, чем openssl
в данном случае.
certtool
которой бы использовались параметры без обычных операторов ( -
или --
), а man certtool
для v. 3.5.8 (debian), 3.5.16 (fedora, единственная версия после этого в стабильной ветке upstream - 3.5.17 от месяц назад), электронная документация GnuTLS и, действительно, онлайновая справочная страница по Ubuntu 17.10 (та же версия, что и у текущего Debian), ссылаются на: