我找到的最接近的答案是使用 "grep"。
> openssl x509 -text -noout -in cert.pem | grep DNS
有更好的方法吗?我只喜欢使用命令行。
谢谢。
我找到的最接近的答案是使用 "grep"。
> openssl x509 -text -noout -in cert.pem | grep DNS
有更好的方法吗?我只喜欢使用命令行。
谢谢。
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}'
这将打印出一个列表,与此处找到的grep
和sed
解决方案一样。不同之处在于更严格地控制了信息的位置。如果输出格式发生变化,此版本更加健壮,并且能够更好地处理变化。仅打印出“Subject Alternative Name”和紧接着的下一个“X509v3”部分之间的文本,并剥离所有可选的前导“DNS:”文本。
android.clients.google.com
android.com
developer.android.google.cn
g.co
goo.gl
...
也许这已经足够了:
openssl x509 -in cert.pem -noout -text -certopt ca_default,no_sigdump
添加一个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>
grep
有什么问题? - Raman