Вопрос или проблема
Есть ли способ перечислить все домены на SAN/UCC SSL сертификате (желательно с использованием командной строки на linux/os x)?
Ясно, что должен быть какой-то способ извлечь данные, так как браузеры могут это сделать. К сожалению, я вижу список, но не могу его скопировать и вставить.
openssl x509 -text < $CERT_FILE
#=>
. . .
DNS: . . .
. . .
где $CERT_FILE
может иметь расширение .pem
или .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 "обработка $name ..."; done
и т.д.
Или для списка, разделённого запятыми, в одной строке, замените join("\n",
на join(",",
(Опция -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
Многие из этих ответов используют перенаправление вывода, хотя openssl
имеет свои собственные инструменты для поиска файла. В эти дни, обычно используя Letsencrypt, вы будете использовать fullchain.pem
как файл-ссылку в директории domain.tld/
, которую вы хотите проверять.
Это некоторые полезные основные команды, которые могут избежать |
и <
перемещения ввода и перенаправления с использованием -in
для обозначения исходного файла:
openssl x509 -text -in fullchain.pem
Чтобы избежать вывода всего сертификата в файл, используйте -noout
:
openssl x509 -text -noout -in fullchain.pem
Чтобы изолировать строку, в которой перечислены применимые домены, да, направьте в grep
с | grep DNS:
openssl x509 -text -noout -in fullchain.pem | grep DNS:
Ответ или решение
Перечисление доменов в сертификате SAN/UCC SSL: Подробное руководство
Сертификаты SAN (Subject Alternative Name) или UCC (Unified Communications Certificate) используются для защиты нескольких доменных имен с помощью одного сертификата. Методом, который обеспечит вам извлечение списка доменных имен из сертификата SSL, является использование команды openssl
. В этой статье мы рассмотрим, как это сделать, с учетом возможных конфигураций файлов.
Использование OpenSSL для извлечения доменных имен
Существует несколько способов вывести список доменных имен из сертификата SSL с использованием командной строки в системах Linux и macOS. Все приведенные ниже команды ориентированы на работу с сертификатами в формате PEM (.pem) или CRT (.crt).
-
Базовая команда для отображения сертификата:
openssl x509 -text -in <cert_file>
Здесь
<cert_file>
— это файл вашего сертификата, например,cert.pem
илиfullchain.pem
. Команда выдаст все детали сертификата в человекочитаемом формате. -
Фильтрация по доменным именам:
Чтобы получить только строки, содержащие доменные имена, вы можете использоватьgrep
:openssl x509 -text -in cert.pem | grep DNS
Это затребует все строки, где есть тег
DNS
, что содержит все альтернативные доменные имена.
Упрощение вывода
Если вам нужно улучшить вывод для дальнейшей обработки, можно использовать дополнительные инструменты, такие как sed
и tr
.
-
Пробелами разделенные выводы:
openssl x509 -text -in cert.pem | grep DNS | sed 's/DNS://g' | tr -d ' ' | tr , ' '
Этот вариант очистит вывод, оставив только доменные имена, разделенные пробелами.
-
Вывод в виде новых строк:
openssl x509 -text -in cert.pem | grep DNS | sed 's/DNS://g' | tr -d ' ' | tr , '\n'
Используя этот подход, каждый домен будет выводиться на новой строке.
-
Вывод через запятую:
openssl x509 -text -in cert.pem | grep DNS | sed 's/DNS://g' | tr -d ' '
Если вы хотите получить домены в виде строки, разделенной запятыми, данный вариант будет наиболее подходящим.
Пример получения доменных имен из SSL-сертификата
Для извлечения доменных имен из сертификата на удаленном сервере можно воспользоваться следующей командой:
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);'
Этот пример подключается к серверу через s_client
, извлекает сертификат и, с помощью Perl, форматирует домены для удобного чтения.
Заключение
Извлечение доменных имен из сертификата SAN/UCC SSL может быть выполнено с использованием базовых и продвинутых инструментов командной строки. Это позволяет вам фильтровать, систематизировать и обрабатывать необходимую информацию по мере необходимости. Важно помнить, что с помощью команды openssl
можно управлять сертификатами эффективно, проверяя соответствие и достоверность использования SSL в ваших проектах.
Теперь, когда у вас есть полное руководство, вы можете легко найти и обработать доменные имена из сертификатов SSL, что является критически важным для обеспечения безопасности ваших веб-приложений и сервисов.