我写了这段代码来获取通用名称主题给定域的 SSL 证书中的字段:
$ echo -e "GET / HTTP/1.1\nEOT" | \
openssl s_client -connect google.com:443 2>&1 | \
grep subject
subject=/C=US/ST=California/L=Mountain View/O=Google Inc/CN=*.google.com
然而,这只给了我“主题”值。替代 CN 可能会列在“主题替代名称”字段中。例如:
那么,如何获取 Bash 中主题备用名称字段的值呢?
答案1
这可能不适用于所有情况,但请尝试
openssl s_client -connect google.com:443 2>&1 | openssl x509 -文本 |查询 DNS
答案2
@stuart-p-bentley 写的内容引起了我的思考,我想出了这种使用 , 和 获取逗号分隔的“主题替代名称”列表的方法openssl
。他的答案中的 sed 行在每个示例中都不适用于 FreeBSD。awk
tr
openssl s_client -connect google.com:443 2>&1 | openssl x509 -text | awk '/X509v3 Subject Alternative Name/ {getline;gsub(/ /, "", $0); print}' | tr -d "DNS:"
这是您通过 google.com 获得的信息
*.google.com,*.android.com,*.appengine.google.com,*.cloud.google.com,*.google-analytics.com,*.google.ca,*.google.cl,*.google.co.in,*.google.co.jp,*.google.co.uk,*.google.com.ar,*.google.com.au,*.google.com.br,*.google.com.co,*.google.com.mx,*.google.com.tr,*.google.com.vn,*.google.de,*.google.es,*.google.fr,*.google.hu,*.google.it,*.google.nl,*.google.pl,*.google.pt,*.googleadapis.com,*.googleapis.cn,*.googlecommerce.com,*.googlevideo.com,*.gstatic.cn,*.gstatic.com,*.gvt1.com,*.gvt2.com,*.urchin.com,*.url.google.com,*.youtube-nocookie.com,*.youtube.com,*.youtubeeducation.com,*.ytimg.com,android.com,g.co,goo.gl,google-analytics.com,google.com,googlecommerce.com,urchin.com,youtu.be,youtube.com,youtubeeducation.com
答案3
这是一个版本将要在任何情况下都可以工作(并去除前导空间):
openssl s_client -connect google.com:443 2>&1 | openssl x509 -text |
sed -nr '/^ {12}X509v3 Subject Alternative Name/{n;s/^ *//p}'
答案4
也可以使用开关
-certopt no_pubkey,no_sigdump,no_validity,no_serial,no_header,no_issuer,no_version,no_aux,no_signame,no_subject