如何从 SSL 证书文件转储主题备用名称 (SAN)

ygo*_*goe 5 certificate ssl openssl

我知道我可以使用以下命令从 PEM 证书文件中转储整个信息:

openssl x509 -in certfile -noout -text
Run Code Online (Sandbox Code Playgroud)

而且我已经找到了另一个直接参数来仅显示证书的到期日期:

openssl x509 -in certfile -noout -enddate
Run Code Online (Sandbox Code Playgroud)

但是是否还有一种快捷方式可以只获取替代名称?就像证书可以用于 example.com 以及 www.example.com 一样。在完整的转储中,它在这里:

Certificate:
    Data:
        X509v3 extensions:
            X509v3 Subject Alternative Name: 
                DNS:www.example.com, DNS:example.com
Run Code Online (Sandbox Code Playgroud)

我只是想省去解析此输出并仅获取域名的麻烦。那可能吗?否则,解析此输出的最佳做法是什么?什么可以假设,什么可能改变?我可以使用正则表达式X509v3 Subject Alternative Name:\s*DNS:(\S+)(?:, DNS:(\S+))*吗?

Bre*_*ner 7

为了让它更具可读性,我会做以下事情:

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

这将为您提供一个长列表格式,假设输入与上面的示例相同,如下所示:

*.google.com
*.android.com
*.appengine.google.com
*.cloud.google.com
...
Run Code Online (Sandbox Code Playgroud)

该行的原始输出将是:

DNS:*.google.com, DNS:*.android.com, DNS:*.appengine.google.com, DNS:*.cloud.google.com
Run Code Online (Sandbox Code Playgroud)

当然,您必须为列表选择正确的格式。例如,实际的 Google 列表相当长且难以使用。如果您正在寻找特定的内容,则打破每行上的条目可以让您 grep 查找您正在查找的条目并删除所有其他信息。

所以这个(注意最后的 grep )......

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
Run Code Online (Sandbox Code Playgroud)

结果是...

*.google.com
Run Code Online (Sandbox Code Playgroud)


Oli*_*Sys 2

由于可能有很多条目,我只需选择下一行并使用awk和清理它tr

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

这是您通过 google.com 获得的信息

*.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
Run Code Online (Sandbox Code Playgroud)

  • 我认为值得指出的是“tr -d“DNS:”可能很危险,这意味着删除输入中任何位置、任何顺序的字符 D、N、S 和 : 的所有实例。它不会删除“ DNS:" 作为完整的字符串。例如, echo "MY DOMAIN NAME SERVER: bla" | tr -d "DNS:" 将输出 "MY OMAI AME ERVER bla" (3认同)