Часто в разных скриптах, обрабатывающих серверные TLS-сертификаты, – скажем, для мониторинга, – в качестве источника “целевого” имени при выборе сертификата используется содержание Subject/CN (commonName). Предполагается, что в Subject/CN должно быть доменное имя. Вот типичный пример:
$ openssl x509 -in disruptive.pem -subject -noout -nameopt multiline | awk -F’ = ‘ ‘/commonName/ {print $2}’
disrupted.zone
Однако, если речь про сертификаты для TLS в современном вебе и про имена, то полагаться тут на Subject нельзя. Нужно использовать другой фрагмент сертификата, а именно – расширение SAN (Subject Alternative Name).
Для извлечения расширения SAN при помощи OpenSSL x509 нужно использовать опцию -ext subjectAltName. Выдача состоит из списка, где каждому значимому элементу соотвествует префикс, обозначающий тип. DNS-имена OpenSSL выводит с префиксом “DNS” (кто бы мог подумать!). Пример:
$ openssl x509 -in google-com.cert.pem -noout -ext subjectAltName
X509v3 Subject Alternative Name:
DNS:*.google.com, DNS:*.appengine.google.com
[…]
Кроме “DNS” могут встретиться другие префиксы, обозначающие IP-адреса и т.д. Однако для обработки имён – нужны имена, то есть “DNS”. Скрипт, конечно, несколько усложнится. Пример:
$ openssl x509 -in google-com.cert.pem -noout -ext subjectAltName
> | awk ‘NR>1{split($0,A,”,”);for(k in A){split(A[k],B,”:”); if(B[1]~/DNS/){print B[2]}}}’
> | wc -l
135
Причина использования SAN в том, что имя из поля Subject/CN оконечного (серверного) сертификата браузеры давно не используют в качестве идентификатора при валидации. А чтобы валидация сертификата для веб-узла прошла успешно (в браузере), необходимо наличие подходящего имени в SAN. Более того, современные требования для УЦ по выпуску TLS-сертификатов (“документы CA/B-форума”) прямо не рекомендуют использование поля commonName в Subject оконечных сертификатов для веб-узлов. Это значит, что доменного имени в Subject может просто не оказаться, но сертификат (при прочих равных) будет валидным для браузера.
Все посты подряд / Информационная безопасность / Хабр