Перечисление доменов в SSL-сертификате UCC/SAN

Есть ли способ перечислить все домены в SSL-сертификате SAN/UCC (в идеале, используя командную строку в linux/os x)?

Ясно, что должен быть какой-то способ извлечения данных, так как это могут сделать браузеры. К сожалению, я вижу список, но не могу вырезать и вставить его.

5 ответов

Решение

openssl x509 -text < foo.crt должен сделать свое дело.

Вы можете перечислить домены с помощью этой команды (проверено на Linux):

cat cert.pem | openssl x509 -text | grep DNS

Если вы просто хотите увидеть SAN, grep DNS: это очевидное решение.

Если вы хотите иметь более чистый список для дальнейшей обработки, вы можете использовать это регулярное выражение Perl, чтобы извлечь только имена: @names=/\sDNS:([^\s,]+)/g

Например:

true | openssl s_client -connect example.com:443 2>/dev/null \
| openssl x509 -noout -text \
| perl -l -0777 -ne '@names=/\bDNS:([^\s,]+)/g; print join("\n", sort @names);'

Который вывел бы это:

example.com
example.edu
example.net
example.org
www.example.com
www.example.edu
www.example.net
www.example.org

Таким образом, вы могли бы передать это while read name; do echo "processing $name ..."; done и т.п.

Или для списка через одну строку, разделенного запятыми, замените join("\n", с join(",",

(The -0777 Переключатель для Perl заставляет его читать весь ввод сразу, а не построчно)

если вы хотите ограничить зависимости openssl, grep, sed и tr и при этом иметь легко анализируемый/итерируемый вывод:

  • список, разделенный пробелами :
            $ openssl x509 -text -in cert.pem | grep DNS | sed s/DNS://g | tr -d ' ' | tr , ' '
    
    выход :
            example.com example.org www.example.com www.example.org
    
  • список, разделенный новой строкой :
            $ openssl x509 -text -in cert.pem | grep DNS | sed s/DNS://g | tr -d ' ' | tr , \\n
    
    выход :
            example.com
    example.org
    www.example.com
    www.example.org
    
  • список, разделенный запятыми :
            $ openssl x509 -text -in cert.pem | grep DNS | sed s/DNS://g | tr -d ' '
    
    выход :
            example.com,example.org,www.example.com,www.example.org
    

что тут происходит?

  • openssl x509 -text -in cert.pemсоздает удобочитаемую информацию о сертификате
  • grep DNSизвлекает строки, содержащие строку:DNS
  • sed s/DNS://gудаляет все вхождения:DNS:
  • tr -d ' 'удаляет все пробелы
  • tr , ' 'заменяет все символы запятой на пробел
  • tr , \\nзаменяет все символы запятой символом новой строки
  • |оператор канала передает стандартный вывод команды, предшествующей каналу, на стандартный ввод команды, следующей за ним

Это покажет все альтернативные домены в сертификате (сегодня это необходимо всем браузерам).

      openssl x509 -text -noout < fullchain.pem | grep DNS

Ответ будет такой

      DNS:*.example.ru, DNS:example.ru
Другие вопросы по тегам