У меня есть файл 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), ссылаются на: