如何显示证书的主题备用名称?

98

我找到的最接近的答案是使用 "grep"。

> openssl x509 -text -noout -in cert.pem | grep DNS

有更好的方法吗?我只喜欢使用命令行。

谢谢。


5
grep有什么问题? - Raman
3
Stack Overflow是一个面向编程和开发问题的网站。这个问题似乎与编程或开发无关,因此不适合在此提问。请查看帮助中心中的我可以在这里询问哪些主题。也许Super UserUnix & Linux Stack Exchange更适合您提出问题。另请参阅我在哪里发布有关Dev Ops的问题? - jww
请参考此答案,仅列出名称,不包括“DNS:”等内容。 - mivk
13个回答

0
一个基于 awk 的改进解决方案(致谢:@RandomW):
openssl x509 -in certfile -text -noout \
  -certopt no_header,no_version,no_serial,no_signame,no_validity,no_issuer,no_pubkey,no_sigdump,no_aux \
| awk '/X509v3 Subject Alternative Name:/ {san=1;next} 
      san && /^ *X509v3/ {exit} 
      san { sub(/DNS:/,"",$1);print $1}'

这将打印出一个列表,与此处找到的grepsed解决方案一样。不同之处在于更严格地控制了信息的位置。如果输出格式发生变化,此版本更加健壮,并且能够更好地处理变化。仅打印出“Subject Alternative Name”和紧接着的下一个“X509v3”部分之间的文本,并剥离所有可选的前导“DNS:”文本。

android.clients.google.com
android.com
developer.android.google.cn
g.co
goo.gl
...

0

也许这已经足够了:

openssl x509 -in cert.pem -noout -text -certopt ca_default,no_sigdump

0

添加一个Python替代方案。 前提是您有一个包含“DNS:”记录的字符串。

获取证书详细信息(子进程、OpenSSL模块等) dnsstring包含“openssl”输出的“DNS:”行。 以下是从证书文本输出中获取DNS名称字符串的示例。

for idx, line in enumerate(certoutput.split()):
    if ' X509v3 Authority Key Identifier:' in line:
        dnsstring = certoutput.split()[idx + 1]

# Get a list
[x.replace('DNS:', '').replace(',', '') for x in dnsstring]

# Format to a comma separated string
', '.join([x.replace('DNS:', '').replace(',', '') for x in dnsstring])

一个命令行示例:
true | \
  openssl s_client -showcerts -connect google.com:443 2>/dev/null | \
  openssl x509 -noout -text 2>/dev/null | grep " DNS:" | \
  python -c"import sys; print ', '.join([x.replace('DNS:', '').replace(',', '') for x in sys.stdin.readlines()[0].split()])"

输出:

*.google.com, *.android.com, <etc>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接