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

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

我知道我可以使用此命令从 PEM 证书文件中转储全部信息:

openssl x509 -in certfile -noout -text

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

openssl x509 -in certfile -noout -enddate

但是,有没有捷径可以只获取备用名称?比如,当证书既可用于 example.com,也可用于 www.example.com 时。在完整转储中,它位于此处:

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

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

答案1

以下是我将采取的措施,以使它更具可读性:

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

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

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

该行的原始输出应为:

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

当然,您必须为列表选择正确的格式。例如,实际的 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

结果是...

*.google.com

答案2

我发现这种方法相当有效,并且很容易记住,因为它只是一个grep DNS:

$ openssl x509 -noout -text -in cert.pem | grep DNS:
                DNS:localhost, DNS:someserver1.somedom.local, DNS:someserver2.somedom.com, DNS:someserver3

答案3

我认为最好的方法是这样的:

openssl x509 -in cert_file_name.crt -noout -ext subjectAltName

您可以在此处的 openssl 官方文档中查看有关 -ext 标志的更多信息:https://www.openssl.org/docs/man1.1.1/man1/x509.html

这样,您只需一个命令即可获得所需的相关信息,而无需使用 awk 和 sed 等其他软件。

答案4

除了使用 之外awk,您还可以使用sed

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

这将把 SAN 列表从:

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

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

相关内容