SSL 证书检测 API
最后更新: 2026-10-19
POST /api/v2/tls/check,请求头需带 Content-Type: application/json
与目标完成一次真实的 TLS 握手,返回证书与连接详情。只做握手,不发送 HTTP 请求,也不下载页面内容。接口地址、响应格式与限流为各接口通用,见 API 文档。
| 参数 | 说明 |
|---|---|
host |
域名或 IP 字面量(IPv4,或带不带方括号的 IPv6),必填。传主机名而不是 URL:请先去掉协议、路径与查询。Unicode 域名会转换为 punycode。 |
port |
TCP 端口,1–65535,默认 443。 |
域名会通过 A 与 AAAA 查询解析(IPv4 优先)。最多尝试两个可连接地址,共享 8 秒总预算;单次握手超时 5 秒,DNS 解析超时 3 秒。内网、环回、链路本地与保留地址一律不探测。IP 目标直接连接。
即使证书无效也会完成握手,因此请求成功只代表 TLS 已建立;证书结论看 validation。
示例:
curl -X POST "https://tcp.lc/api/v2/tls/check" \
-H "Content-Type: application/json" \
-d '{"host":"example.com","port":443}'
响应 data 字段:
| 字段 | 说明 |
|---|---|
host |
归一化后的检测目标:域名(IDN 为 punycode)或 IP 字面量。 |
targetType |
domain 或 ip。 |
port |
实际检测的端口。 |
ip |
实际完成握手的地址。 |
addresses |
解析出的可连接地址,IPv4 在前;已过滤内网与保留地址。IP 目标时为该 IP 本身。 |
elapsed |
服务端完成整次检测的耗时(毫秒)。 |
connection |
协商出的 TLS 连接信息,见下表。 |
certificate |
证书详情,见下表。 |
validation |
证书校验结论,见下表。 |
connection 字段:
| 字段 | 说明 |
|---|---|
version |
协商出的 TLS 版本,如 TLSv1.3、TLSv1.2。 |
cipher |
协商出的加密套件,如 TLS_AES_128_GCM_SHA256。 |
forwardSecrecy |
是否具备前向保密(TLS 1.3 全部套件,或更低版本使用 ECDHE/DHE)。 |
alpn |
ALPN 协商结果(h2 或 http/1.1);服务器未响应 ALPN 时为 null。 |
http2 |
ALPN 协商为 h2 时为 true。 |
certificate 字段:
| 字段 | 说明 |
|---|---|
subject |
证书主体,单行 RDN 串,通常以 CN= 开头。 |
issuer |
签发机构,同样是 RDN 串。 |
validFrom |
生效时间,ISO 8601。 |
validTo |
到期时间,ISO 8601。 |
daysRemaining |
距到期的剩余天数(向下取整);已过期时为负值。 |
san |
主题备用名称中的 DNS 名,保留通配符原样。 |
publicKeyAlgorithm |
RSA、RSA-PSS、ECDSA、Ed25519、Ed448 或 DSA。 |
publicKeyBits |
密钥位数,如 2048、256;未知时为 null。 |
publicKeyCurve |
EC 证书的曲线名,如 prime256v1;其它类型为 null。 |
validation 字段:
| 字段 | 说明 |
|---|---|
valid |
签发链受信任、证书在有效期内且与主机名匹配时为 true。 |
issues |
校验问题类别;valid 为 true 时为空。 |
errorCode |
原始 OpenSSL/Node 错误码,如 CERT_HAS_EXPIRED,便于排查;有效时为 null。 |
issues 取值:
| 值 | 含义 |
|---|---|
expired |
证书已过期。 |
notYetValid |
证书尚未生效。 |
hostname |
证书与请求的主机名不匹配。 |
selfSigned |
证书为自签名。 |
untrusted |
证书链不受信任,例如缺少中间证书或签发机构未知。 |
unknown |
其它校验失败原因。 |
示例:
{
"code": 200,
"msg": "ok",
"data": {
"host": "example.com",
"targetType": "domain",
"port": 443,
"ip": "93.184.215.14",
"addresses": ["93.184.215.14", "2606:2800:21f:cb07:6820:80da:af6b:8b2c"],
"elapsed": 182,
"connection": {
"version": "TLSv1.3",
"cipher": "TLS_AES_128_GCM_SHA256",
"forwardSecrecy": true,
"alpn": "http/1.1",
"http2": false
},
"certificate": {
"subject": "CN=example.com",
"issuer": "C=US, O=DigiCert Inc, CN=DigiCert TLS RSA SHA256 2020 CA1",
"validFrom": "2026-01-01T00:00:00.000Z",
"validTo": "2027-01-01T23:59:59.000Z",
"daysRemaining": 74,
"san": ["example.com", "www.example.com"],
"publicKeyAlgorithm": "RSA",
"publicKeyBits": 2048,
"publicKeyCurve": null
},
"validation": {
"valid": true,
"issues": [],
"errorCode": null
}
}
}
证书无效不算接口错误:仍返回 code: 200,结论在 validation 中。这里只展示该对象:
{
"code": 200,
"msg": "ok",
"data": {
"validation": {
"valid": false,
"issues": ["expired"],
"errorCode": "CERT_HAS_EXPIRED"
}
}
}
错误
失败时 code 为 -1000,msg 为稳定标识,data.args 可能携带细节。
msg |
含义 |
|---|---|
api.param.host.invalid |
缺少 host,或无法解析为域名/IP 字面量;data.args.host 为原始输入。 |
api.param.port.invalid |
端口不是 1-65535 的整数;data.args.port 为原始输入。 |
api.param.host.private |
解析出的地址全部为内网或保留地址,无法探测。 |
api.notfound.domain |
域名不存在(NXDOMAIN);data.args.name 为域名。 |
api.notfound.address |
域名没有 A 或 AAAA 记录;data.args.name 为域名。 |
api.upstream.timeout |
DNS 解析超时。 |
api.upstream.error |
DNS 解析因其它原因失败。 |
api.upstream.tls.timeout |
TLS 握手超时。 |
api.upstream.tls.refused |
连接被拒绝——端口没有服务监听,或未启用 TLS。 |
api.upstream.tls.handshake |
TLS 握手失败;站点可能不支持 HTTPS,或其 TLS 配置与检测端不兼容。 |
api.upstream.tls.error |
握手因其它网络原因失败。 |
api.rate.limitedDaily |
今日配额已用完,响应带 Retry-After 头。 |
api.server.internal |
服务端或配置异常。 |
示例:
{
"code": -1000,
"msg": "api.param.host.private",
"data": null
}
说明
- IP 目标会跳过主机名匹配,因为证书 SAN 中可能不包含 IP;有效期与证书链信任仍会校验。
- 在 CDN 或拥有多个地址的域名后面,不同边缘节点可能返回不同证书;
ip为实际连接的地址。 validation覆盖证书链信任、有效期与主机名匹配,不检查吊销状态(CRL/OCSP)。- 只进行 TLS 握手,服务端不会发送 HTTP 请求。
限流与缓存
按客户端 IP 限流:每分钟 10 次、每天 100 次;所有请求(包括失败的请求)均计入。每日额度按 UTC+8 零点重置。分钟额度用完时返回 api.rate.limited,每日额度用完时返回 api.rate.limitedDaily,均带 Retry-After 响应头(秒)。
成功响应带 Cache-Control: public, max-age=300, s-maxage=600;错误响应带 Cache-Control: no-store。