Como despejar o Subject Alternative Name (SAN) de um arquivo de certificado SSL

2

Eu sei que posso despejar toda a informação de um arquivo de certificado PEM com este comando:

openssl x509 -in certfile -noout -text

E eu já encontrei outro parâmetro direto para mostrar apenas a data de expiração de um certificado:

openssl x509 -in certfile -noout -enddate

Mas existe também um atalho para obter apenas os nomes alternativos? Como quando um certificado pode ser usado para example.com e também para www.example.com. No despejo completo, está aqui:

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

Gostaria apenas de salvar o incômodo para analisar essa saída e obter apenas os nomes de domínio. Isso é possível? Caso contrário, quais seriam as melhores práticas para analisar essa saída? O que pode ser assumido, o que pode mudar? Eu poderia usar um regexp como X509v3 Subject Alternative Name:\s*DNS:(\S+)(?:, DNS:(\S+))* ?

    
por ygoe 10.11.2013 / 16:44

4 respostas

1

Como pode haver muitas entradas, basta selecionar a próxima linha e limpá-la usando awk e tr

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

Veja o que você obtém com o google.com.br

*.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
    
por 22.09.2014 / 12:14
1

Veja o que eu faria para torná-lo um pouco mais legível:

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

Isso faz com que você tenha um formato de lista longo, assumindo a mesma entrada do exemplo acima, algo assim:

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

Onde a saída bruta da linha teria sido:

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

Claro que você tem que escolher o formato certo para sua lista. Por exemplo, essa lista real do Google é bastante longa e difícil de consumir. Se você está procurando por algo específico, quebrar as entradas em cada linha permite que você busque a entrada que está procurando e remova todas as outras informações.

Então isso (observe o grep no final) ...

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

Resultados em ...

*.google.com
    
por 07.12.2017 / 16:26
0

Eu acho que este método funciona razoavelmente bem e é fácil de lembrar, já que é apenas um grep DNS: .

$ openssl x509 -noout -text -in cert.pem | grep DNS:
                DNS:localhost, DNS:someserver1.somedom.local, DNS:someserver2.somedom.com, DNS:someserver3
    
por 13.02.2018 / 14:41
0

Além de usar awk , você pode usar sed :

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

Isso transformará uma lista de SAN de:

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

para

domain1.com, www.domain2.com, domain3.com, sub.domain3.com
    
por 27.07.2018 / 18:22