参考

用 curl 检查 SSL 证书:ssl.sh 命令行用法

作者: · 最后核实

在终端里运行 curl ssl.sh/example.com,ssl.sh 会连接 example.com 的 443 端口,读取服务器发来的证书链,输出一份摘要:是否有效、还剩几天、谁签发的、证书链全不全、是否受信任、TLS 版本和评级。不需要安装任何东西,服务器上、本机上都能直接用。

快速上手

下面的命令直接用 curl 就能跑。写脚本时建议用完整的 https:// 地址并加 -f,这样检查失败时 curl 会返回非 0 退出码。

curl ssl.sh/example.com              # 带颜色的摘要
curl ssl.sh/example.com:8443         # 其他端口
curl ssl.sh/example.com/days         # 只输出剩余天数
curl ssl.sh/example.com/chain        # 完整证书链 PEM
curl ssl.sh/example.com/json         # JSON
curl ssl.sh/ct/example.com           # 查 CT 日志里的签发记录
curl 'ssl.sh/example.com?lang=zh'    # 中文输出
curl ssl.sh/help                     # 用法说明

中文输出示例(去掉了颜色):

example.com:443  ● 有效  评级 A  64 天后过期
────────────────────────────────────────────────────────────
使用者     example.com
域名       example.com, www.example.com
签发者     R12 · Let's Encrypt
有效期     2026-10-15 → 2027-01-13 (90d)
密钥       RSA 2048 · sha256WithRSAEncryption · DV
TLS        TLSv1.3 · TLS_AES_256_GCM_SHA384 · h2
证书链     2 张证书 · 完整 · 受信任 (ISRG Root X1)
IP         203.0.113.10

✓ 证书有效且受信任,64 天后过期。
✓ 证书链完整。
✓ 支持 TLS 1.3。

完整报告: https://ssl.sh/example.com?lang=zh

有问题时会用 !(警告)或 ✗(错误)标出来,并附上解决办法的链接,例如证书过期会指向 NET::ERR_CERT_DATE_INVALID。

路径

路径 输出
/<域名> 检查摘要,默认 443 端口。
/<域名>:<端口> 检查其他端口,如 /mail.example.com:465。
/<域名>/days 距离过期的整天数(已过期为负数)。失败时内容为空,HTTP 状态码 4xx/5xx。
/<域名>/chain 站点证书 + 中间证书的 PEM,不含根证书。服务器漏发的中间证书会按 AIA 下载补齐,可以直接当 fullchain.pem 用。
/<域名>/json 完整结果的 JSON,和 /api/v1/check 相同。
/ct/<域名> CT 日志里该域名及子域名的证书,按签发时间倒序。

也可以直接粘贴网址:curl ssl.sh/https://example.com/login 检查的是 example.com。中文域名会自动转成 punycode。

参数

参数 作用
?T 或 ?nocolor 不输出 ANSI 颜色,适合重定向到文件。
?full 完整检查:逐个测试 TLS 1.0/1.1/1.2/1.3,读取 HSTS 响应头,查 CAA 记录,查吊销状态(先 OCSP 后 CRL)。会慢一些。
?fresh=1 跳过 5 分钟缓存。
?starttls=smtp 强制 STARTTLS:smtp、imap、pop3、ftp、xmpp、postgres。
?lang=zh 中文输出。
?json 任何路径都输出 JSON(或者请求头带 Accept: application/json)。

多个参数用 & 连接,在 shell 里记得给网址加引号:curl 'ssl.sh/example.com?full&T'。

端口和 STARTTLS

支持的端口:443、8443、4443、9443、10443、465、587、25、993、995、143、110、21、990、636、853、5222、5432、6443、2083、2087、8883。宝塔面板默认的 8888 等管理端口不在其中。25 和 587(SMTP)、143(IMAP)、110(POP3)、21(FTP)、5222(XMPP)、5432(PostgreSQL)自动走 STARTTLS,其余端口按直接 TLS 检查。

curl ssl.sh/smtp.example.com:587
curl ssl.sh/imap.example.com:993

在脚本里用

证书剩余不到 14 天时报警,可以放进 crontab:

#!/usr/bin/env bash
host=example.com
days=$(curl -fsS "https://ssl.sh/$host/days") || { echo "$host 检查失败"; exit 2; }
if [ "$days" -lt 14 ]; then
  echo "$host 的证书还有 $days 天过期"
  exit 1
fi

服务器漏发中间证书时,直接下载补齐后的证书链给 Nginx 用:

curl -fsS https://ssl.sh/example.com/chain > fullchain.pem
openssl crl2pkcs7 -nocrl -certfile fullchain.pem | openssl pkcs7 -print_certs -noout

在宝塔面板里,把 fullchain.pem 的内容粘贴到“证书(PEM 格式)”一栏即可;阿里云、腾讯云下载的 Nginx 证书包通常已经包含中间证书。

用 jq 取字段:

curl -fsS https://ssl.sh/example.com/json | jq '{grade, days_left, issuer: .chain[0].issuer_cn}'

评级

评级 含义
A+ 受信任,只开启 TLS 1.2/1.3,且 HSTS 的 max-age 不少于 180 天(需要 ?full)。
A 受信任且在有效期内,没有发现弱协议、弱套件或弱密钥。
B 仍开启 TLS 1.0/1.1,或协商到了弱加密套件。
C 密钥太弱(RSA 小于 2048 位)或证书链里有 SHA-1 签名。
F 已过期、尚未生效、域名不匹配、已吊销,或只支持过时的 TLS。
T 不受信任:自签名、根证书不受信任,或证书链无法补全。

额度和隐私

  • 每个 IP 每分钟 30 次检查,命中 5 分钟缓存的不计数。带 API Key(Authorization: Bearer <key> 或 ?key=)时按套餐额度。
  • 只连接公网地址;内网、回环、链路本地、100.64.0.0/10 和其他保留网段一律拒绝,返回 blocked_address。
  • 检查结果不公开、不收录,/<域名> 结果页都带 noindex。

常见问题

为什么返回的是网页而不是文字?

只有命令行工具(curl、Wget、HTTPie、xh、python-requests、Go 的 net/http、aiohttp、libfetch)会拿到纯文本。Windows PowerShell 里的 curl 其实是 Invoke-WebRequest 的别名,请改用 curl.exe ssl.sh/example.com,或者在网址后面加 ?json。

刚换了证书,查到的还是旧的?

检查结果会缓存 5 分钟(失败的结果缓存 1 分钟)。在网址后加 ?fresh=1 可以跳过缓存重新连接。如果用了 CDN(阿里云 CDN、腾讯云 CDN、Cloudflare 等),查到的是 CDN 节点上的证书,换证书要在 CDN 控制台里换。

资料来源

  1. RFC 5280:X.509 证书与 CRL
  2. RFC 8446:TLS 1.3
  3. RFC 6797:HTTP 严格传输安全(HSTS)
  4. RFC 8659:DNS CAA 记录