У мене є файл 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:"
Зверніть увагу, що файл спрямований на стандартний вхід через <
, а не використовувати його як аргумент. Sans 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
для версії 3.5.8 (debian), 3.5.16 (Fedora, єдиною після цього в стабільній гілці за течією є 3.5.17 від місяць тому), онлайн-документація GnuTLS і, дійсно, сторінка для користувача Ubuntu 17.10 (така ж версія, як і поточний debian) стосуються: