我知道我可以使用此命令从 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