在 UCC/SAN SSL 证书上列出域

Jor*_*ter 17 certificate ssl-certificate ucc

有没有办法列出 SAN/UCC SSL 证书上的所有域(最好在 linux/os x 上使用命令行)?

显然必须有某种方法来提取数据,因为浏览器可以做到这一点。不幸的是,我可以看到列表但不能剪切和粘贴它。

Dan*_*tts 28

openssl x509 -text < foo.crt 应该做的伎俩。

请参阅https://gist.github.com/danpritts/2d596b8c01828e9f09329fa741d8838d了解用于查看证书文件和检查证书和密钥文件是否匹配的几个 shell 函数。

  • 对于后代,这是我使用的完整命令,因为我是为另一台服务器做的:`openssl s_client -showcerts -connect www.example.org:443 | openssl x509 -text` (3认同)
  • 要获得一个干净的以空格分隔的域列表,您可以像这样通过 grep 和 sed 传递它`openssl x509 -text &lt; $CRT | grep 'DNS:' | sed 's/\s*DNS:\([a-z0-9.\-]*\)[,\s]\?/\1 /g'` (3认同)

小智 12

您可以使用此命令列出域(在 linux 上测试):

cat cert.pem | openssl x509 -text | grep DNS
Run Code Online (Sandbox Code Playgroud)


miv*_*ivk 5

如果您只想查看SAN,grep DNS:这是显而易见的解决方案。

如果您想要一个更清晰的列表来进一步处理,您可以使用此 Perl 正则表达式仅提取名称:@names=/\sDNS:([^\s,]+)/g

例如:

true | openssl s_client -connect example.com:443 2>/dev/null \
| openssl x509 -noout -text \
| perl -l -0777 -ne '@names=/\bDNS:([^\s,]+)/g; print join("\n", sort @names);'
Run Code Online (Sandbox Code Playgroud)

这会输出:

example.com
example.edu
example.net
example.org
www.example.com
www.example.edu
www.example.net
www.example.org
Run Code Online (Sandbox Code Playgroud)

所以你可以通过管道将其传递给while read name; do echo "processing $name ..."; done等。

或者对于一行中以逗号分隔的列表,替换join("\n",join(",",

-0777perl 的开关使其立即读取整个输入,而不是逐行读取)