3

Я знаю, что могу вывести всю информацию из файла сертификата PEM с помощью этой команды:

openssl x509 -in certfile -noout -text

И я уже нашел другой прямой параметр, который показывает мне только срок действия сертификата:

openssl x509 -in certfile -noout -enddate

Но есть ли ярлык, чтобы получить только альтернативные имена? Например, когда сертификат можно использовать как для example.com, так и для www.example.com. В полном дампе это здесь:

Certificate:
    Data:
        X509v3 extensions:
            X509v3 Subject Alternative Name: 
                DNS:www.example.com, DNS:example.com

Я просто хотел бы избавить меня от необходимости разбирать этот вывод и получать только доменные имена. Это возможно? В противном случае, что было бы лучше всего проанализировать этот результат? Что можно предположить, что может измениться? Могу ли я использовать регулярное выражение типа X509v3 Subject Alternative Name:\s*DNS:(\S+)(?:, DNS:(\S+))*?

4 ответа4

1

Вот что я хотел бы сделать, чтобы сделать его немного более читабельным:

for i in $(openssl x509 -in certfile -noout -text | grep -A1 'Subject Alternative Name' | tail -n1 | tr -d ','); { echo $i | cut -f2 -d:; }

Это дает вам длинный список формата, предполагая, что тот же ввод, что и в примере выше, что-то вроде этого:

*.google.com
*.android.com
*.appengine.google.com
*.cloud.google.com
...

Где был бы необработанный вывод строки:

DNS:*.google.com, DNS:*.android.com, DNS:*.appengine.google.com, DNS:*.cloud.google.com

Конечно, вы должны выбрать правильный формат для вашего списка. Например, этот фактический список Google довольно длинный и сложный для использования. Если вы ищете что-то конкретное, разбивая записи в каждой строке, вы можете найти нужную вам запись и удалить всю другую информацию.

Так вот (обратите внимание на grep в конце) ...

for i in $(openssl x509 -in certfile -noout -text | grep -A1 'Subject Alternative Name' | tail -n1 | tr -d ','); { echo $i | cut -f2 -d:; } | grep google.com

Результаты в ...

*.google.com
1

Поскольку записей может быть много, я просто выбираю следующую строку и очищаю ее с помощью awk и tr

openssl x509 -noout -text -in certfile | awk '/X509v3 Subject Alternative Name/ {getline;gsub(/ /, "", $0); print}' | tr -d "DNS:"

Вот что вы получаете с google.com

*.google.com,*.android.com,*.appengine.google.com,*.cloud.google.com,*.google-analytics.com,*.google.ca,*.google.cl,*.google.co.in,*.google.co.jp,*.google.co.uk,*.google.com.ar,*.google.com.au,*.google.com.br,*.google.com.co,*.google.com.mx,*.google.com.tr,*.google.com.vn,*.google.de,*.google.es,*.google.fr,*.google.hu,*.google.it,*.google.nl,*.google.pl,*.google.pt,*.googleadapis.com,*.googleapis.cn,*.googlecommerce.com,*.googlevideo.com,*.gstatic.cn,*.gstatic.com,*.gvt1.com,*.gvt2.com,*.urchin.com,*.url.google.com,*.youtube-nocookie.com,*.youtube.com,*.youtubeeducation.com,*.ytimg.com,android.com,g.co,goo.gl,google-analytics.com,google.com,googlecommerce.com,urchin.com,youtu.be,youtube.com,youtubeeducation.com
0

В дополнение к использованию awk , вы можете использовать sed:

openssl x509 -in cert_file_name.crt -noout -text | awk '/DNS:/' | sed 's/DNS://g'

Это превратит список SAN из:

DNS:domain1.com, DNS:www.domain2.com, DNS:domain3.com, DNS:sub.domain3.com

в

domain1.com, www.domain2.com, domain3.com, sub.domain3.com
0

Я считаю, что этот метод работает достаточно хорошо и его легко запомнить, так как это просто grep DNS:

$ openssl x509 -noout -text -in cert.pem | grep DNS:
                DNS:localhost, DNS:someserver1.somedom.local, DNS:someserver2.somedom.com, DNS:someserver3

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .