参考
用 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 控制台里换。