命令行查看远程 SSL 证书的三种方法
命令行查看远程站点证书的三种方式:openssl s_client(信息最全)、curl -vI(最顺手)、nmap ssl-cert 脚本(批量扫描)。按场景选择,附完整命令。
一句话回答:信息最全用 openssl s_client:echo | openssl s_client -showcerts -servername 域名 -connect 域名:443 2>/dev/null | openssl x509 -noout -text;快速瞄一眼用 curl -vI https://域名,输出里带证书主体与有效期;批量扫描多台用 nmap -p 443 --script ssl-cert 域名。
方法一:openssl(信息最全)
echo | openssl s_client -showcerts -servername example.com -connect example.com:443 2>/dev/null | openssl x509 -inform pem -noout -text
输出包含证书全部字段:Subject、Issuer、有效期、SAN 列表、签名算法、公钥等——与浏览器"查看证书"弹窗等价的信息量。
只想看特定字段时替换结尾的 -text:
... | openssl x509 -noout -dates # 只看有效期
... | openssl x509 -noout -subject -issuer -ext subjectAltName
-showcerts 展示的是服务器发送的证书,不保证链已验证;管道后的 x509 默认只解析第一张。上面的命令隐藏了诊断,仅供查看。要做校验,应保留错误输出并显式启用主机名验证,例如:
openssl s_client -connect example.com:443 -servername example.com \
-verify_hostname example.com -verify_return_error </dev/null
方法二:curl(最顺手)
curl -vvI https://example.com 2>&1 | awk 'BEGIN { cert=0 } /^\* SSL connection/ { cert=1 } /^\*/ { if (cert) print }'
或者直接看 curl verbose 输出里的证书段落:
curl -vI https://example.com 2>&1 | grep -A8 'Server certificate'
curl 可见证书信息取决于版本和 TLS 后端,未必有相同的 Server certificate 文本,但命令短、机器上基本都有,适合快速确认"证书是谁、什么时候到期"。
方法三:nmap(批量扫描)
nmap -p 443 --script ssl-cert example.com
# 批量:nmap -p 443 --script ssl-cert 192.168.1.0/24
仅对自己管理或获得授权的目标执行扫描。ssl-cert 脚本输出证书主体、有效期、公钥类型,适合对一批主机做证书盘点。
周期巡检时保存目标域名、端口、证书指纹和到期日,续期后复查各入口是否已经切换到新证书。同一域名有多个入口时,要分别核对,避免只检查到其中一台服务器。
三种方法对比
| 工具 | 信息量 | 适用场景 |
|---|---|---|
| openssl s_client | 全部字段 + 证书链 | 排查证书问题、导出证书 |
| curl -v | 主体/签发者/有效期 | 快速确认 |
| nmap | 结构化摘要 | 多主机批量盘点 |
常见问题(FAQ)
Q:为什么一定要加 -servername?
A:显式 SNI 让测试意图清晰,尤其 connect 使用 IP 时。OpenSSL 1.1.1 起通常会从 -connect 的 DNS 名自动设置 SNI;要测试无 SNI 须用 -noservername。
Q:能把证书直接保存成文件吗?
A:可以:echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null | openssl x509 > example.pem,保存后就能用 openssl x509 -in example.pem -text 离线分析。
Q:端口不是 443 怎么办?
A:把命令里的 :443 换成实际端口即可(如 8443、9443),三个工具都支持自定义端口。
核查依据
本文依据官方文档核对,示例未在实际业务环境运行;上线前请按部署版本、权限与数据范围验证。