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

> curl ssl.sh/域名 查证书摘要，/days 只输出剩余天数，/chain 输出补齐的完整证书链，/json 输出 JSON，不用装任何软件。

Source: https://ssl.sh/zh/docs/cli/
Last updated: 2026-11-10

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

## 快速上手

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

```bash
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                     # 用法说明
```

中文输出示例（去掉了颜色）：

```text
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](https://ssl.sh/zh/errors/net-err-cert-date-invalid/)。

## 路径

| 路径 | 输出 |
|---|---|
| `/<域名>` | 检查摘要，默认 443 端口。 |
| `/<域名>:<端口>` | 检查其他端口，如 `/mail.example.com:465`。 |
| `/<域名>/days` | 距离过期的整天数（已过期为负数）。失败时内容为空，HTTP 状态码 4xx/5xx。 |
| `/<域名>/chain` | 站点证书 + 中间证书的 PEM，不含根证书。服务器漏发的中间证书会按 AIA 下载补齐，可以直接当 `fullchain.pem` 用。 |
| `/<域名>/json` | 完整结果的 JSON，和 [`/api/v1/check`](devdoc:api) 相同。 |
| `/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 检查。

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

## 在脚本里用

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

```bash
#!/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
```

服务器[漏发中间证书](https://ssl.sh/zh/errors/missing-intermediate-certificate/)时，直接下载补齐后的证书链给 Nginx 用：

```bash
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 取字段：

```bash
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`。
