Перечисление доменов в SSL-сертификате UCC/SAN
Есть ли способ перечислить все домены в SSL-сертификате SAN/UCC (в идеале, используя командную строку в linux/os x)?
Ясно, что должен быть какой-то способ извлечения данных, так как это могут сделать браузеры. К сожалению, я вижу список, но не могу вырезать и вставить его.
5 ответов
Вы можете перечислить домены с помощью этой команды (проверено на 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