前言:为什么你需要用curl查看SSL证书详情
运维工作中,经常需要快速确认一个网站用了什么证书、证书由谁颁发、什么时候过期、证书链是否完整。这些信息浏览器能看,但用命令行来查效率更高——可以写进脚本、集成到自动化巡检流程里,也方便在服务器上直接操作不依赖图形界面。
curl是Linux/Unix系统标配的命令行工具,Windows 10及以上也内置了PowerShell版本的curl。本文详细介绍如何用curl及相关命令查看SSL证书的完整信息,涵盖证书链解析、域名匹配验证、证书导出等实用场景。
一、用curl连接目标并提取证书信息
1.1 基础命令:openssl s_client
严格来说,查看SSL证书详情最标准的工具是OpenSSL的s_client命令,但curl配合--cert和--cacert参数同样能完成大量证书相关的诊断工作。
openssl s_client -connect www.example.com:443 -servername www.example.com
执行后会输出SSL握手详情,末尾即是服务器证书信息。-servername参数用于SNI(Server Name Indication),不加的话多域名证书可能返回错误的证书。
1.2 只显示证书,不进行TLS握手
如果只想提取证书内容,用以下命令组合:
echo | openssl s_client -connect www.example.com:443 -servername www.example.com 2>/dev/null | openssl x509 -noout -text
其中openssl x509 -text将证书内容以可读格式输出,包含以下核心字段:
- Serial Number:证书序列号,CA分配的唯一编号
- Issuer:颁发者(CA机构名称)
- Validity:有效期(Not Before / Not After)
- Subject:证书持有者信息
- Subject Alternative Name (SAN):支持的域名列表
- Public Key:公钥算法和长度
- Signature Algorithm:签名算法
1.3 用curl的-v模式查看连接握手信息
curl -v https://www.example.com 2>&1 | grep -E "(SSL|TLS|certificate|issuer|expire)"
这个命令在调试HTTPS连接时很实用,可以快速确认服务器使用的是什么TLS版本和密码套件。
二、提取证书的特定字段
有时光看完整输出太冗长,需要提取某个具体字段。以下是几个常用命令:
2.1 查看证书到期时间
echo | openssl s_client -connect www.example.com:443 2>/dev/null | openssl x509 -noout -enddate
输出格式为:notAfter=Jun 15 23:59:59 2027 GMT
2.2 查看证书颁发者
echo | openssl s_client -connect www.example.com:443 2>/dev/null | openssl x509 -noout -issuer
2.3 查看证书持有者域名
echo | openssl s_client -connect www.example.com:443 2>/dev/null | openssl x509 -noout -subject
2.4 查看证书指纹(SHA256)
echo | openssl s_client -connect www.example.com:443 2>/dev/null | openssl x509 -noout -fingerprint -sha256
证书指纹常用于快速比对两个服务器是否使用同一张证书。
2.5 查看证书SAN域名列表
openssl s_client -connect www.example.com:443 2>/dev/null | openssl x509 -noout -text | findstr "Subject Alternative"
三、查看完整证书链
现代HTTPS站点通常部署多级证书链(服务器证书 → 中间CA → 根CA)。证书链不完整会导致部分客户端无法验证,引发SSL握手错误。
echo | openssl s_client -connect www.example.com:443 -showcerts 2>/dev/null
-showcerts参数会输出完整证书链中的所有证书。每个证书以"-----BEGIN CERTIFICATE-----"开头,可以复制出来进一步分析。
将证书链保存为PEM文件
echo | openssl s_client -connect www.example.com:443 -showcerts 2>/dev/null | sed -n '/-----BEGIN/,/-----END/p' > cert_chain.pem
在Linux/macOS下用sed提取,在Windows PowerShell中可以用类似思路保存到文件。
四、验证证书域名匹配
如果手头有一张证书文件(如下载的.cer或.pem),想验证它是否匹配某个域名:
openssl x509 -in certificate.pem -noout -text | grep Subject:
openssl s_client -connect www.example.com:443 2>/dev/null | openssl x509 -noout -subject -issuer
对比两者的Subject字段是否一致,或者用SAN中的域名列表做最终确认。
五、忽略证书验证的特殊场景
在测试环境下访问自签名证书的服务器,可以临时跳过证书验证:
curl -k https://自签名域名.com
-k(或--insecure)参数告诉curl忽略证书链验证。但请注意:永远不要在生产环境的业务请求中使用此参数。
更安全的替代方案是指定受信任的CA证书文件:
curl --cacert /path/to/ca-bundle.crt https://example.com
--cacert指定受信任的CA证书库,curl会用这个文件验证服务器证书链是否可信。
六、Windows PowerShell环境下的适配
Windows 10+ 自带的PowerShell中可以直接调用curl(实际是Invoke-WebRequest的别名),但建议直接用OpenSSL命令行工具。Windows下推荐使用以下方式之一获取OpenSSL:
- 通过 Git for Windows 自带的 Git Bash 环境
- 安装 Chocolatey 后执行
choco install openssl - 使用 WSL(Windows Subsystem for Linux)
WSL环境下命令与Linux完全一致,适合需要经常做服务器证书诊断的运维人员。
七、一行命令汇总:快速巡检脚本
结合上面的知识,可以写一个简洁的批量检查脚本:
#!/bin/bash
DOMAIN="www.example.com"
echo "=== 检查 $DOMAIN 的SSL证书 ==="
echo "到期时间:"
echo | openssl s_client -connect $DOMAIN:443 -servername $DOMAIN 2>/dev/null | openssl x509 -noout -enddate
echo "颁发者:"
echo | openssl s_client -connect $DOMAIN:443 -servername $DOMAIN 2>/dev/null | openssl x509 -noout -issuer
echo "证书指纹(SHA256):"
echo | openssl s_client -connect $DOMAIN:443 -servername $DOMAIN 2>/dev/null | openssl x509 -noout -fingerprint -sha256
将DOMAIN变量替换为需要巡检的域名,丢到crontab里就能实现定期证书有效期告警。
总结
用命令行查看SSL证书详细信息,是每个运维工程师和安全人员的必备技能。本文覆盖了:
- openssl s_client 基础连接与证书提取
- openssl x509 各字段的单独提取方法
- 证书链的完整导出
- curl忽略/指定证书验证的使用场景
- Windows环境下的适配方案
- 快速巡检脚本的编写思路
结合前面文章中介绍的curl测试网站HTTPS证书有效期命令和curl忽略SSL证书错误参数详解,基本上curl与SSL证书相关的操作就能覆盖全面了。
相关文章
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论