openssl ts 是什么
openssl ts 实现 RFC 3161 时间戳协议(TSP):把一份数据的摘要交给可信时间戳机构(TSA),换回一份带签名的时间戳令牌,用来证明「该数据在某个时刻已经存在」。子命令主要做两件事——生成时间戳请求并以 -queryfile 重放校验响应。OpenSSL 1.1.1 与 3.x 都带这个子命令,Linux、macOS、Windows 上的用法一致;它不校验内容本身,只把摘要与时间绑定。
基本信息
| 适用平台 | OpenSSL 1.1.1 / 3.x(Linux、macOS、Windows) |
|---|---|
| 生成请求 | openssl ts -query -data file -sha256 -out req.tsq |
| 校验响应 | openssl ts -verify -in resp.tsr -queryfile req.tsq -CAfile chain.pem |
| 查看内容 | openssl ts -reply -in resp.tsr -text |
| 摘要算法 | -sha256 起步;生产环境避免使用 SHA-1 |
| 产物 | .tsq 请求与 .tsr 响应,后者可再嵌入签名流程 |
| 配套 | 需要 TSA 网络端点或离线 TSA 服务的证书链 |
典型使用场景
- 代码签名加固:给已签名的安装包或 jar 取时间戳,签名在签名证书过期后仍能被验证
- 长期档案存证:为归档数据摘要取时间戳,证明文件在某个日期之前未被改动
- 审计与合规:日志批次、报表、交易清单的存在时间证明
- 与 PDF 或文档签名配合:作为签名时间来源之一,避免依赖本机时钟
- 历史材料复核:拿到往年的 .tsr 与原始数据时用 -queryfile 重放验证是否仍成立
请求与校验完整回路
请求与校验完整回路
openssl ts -query -data release.tar.gz -sha256 -out release.tsq # 生成请求,内含数据摘要
curl -H 'Content-Type: application/timestamp-query' --data-binary @release.tsq \
-o release.tsr https://tsa.example.com/ # 提交给 TSA 取得响应
openssl ts -reply -in release.tsr -text | head -30 # 先看签发者、状态与时间
openssl ts -verify -in release.tsr -queryfile release.tsq \
-CAfile tsa-chain.pem # 校验签名链与摘要一致性
openssl ts -verify -in release.tsr -queryfile release.tsq \
-CAfile tsa-root.pem -untrusted tsa-intermediate.pem # 链不全时补中间证书再验时间戳响应逐字段读法
| 字段 | 含义 | 判读要点 |
|---|---|---|
| Status | TSA 的受理结果 | granted 才算成功;rejection 说明策略或请求格式不被接受 |
| Policy | 时间戳策略 OID | 应与 TSA 公布策略一致,审计时需要留档 |
| Hash algorithm | 请求使用的摘要算法 | sha256 正常;仍出现 sha1 需确认是否满足合规要求 |
| Message digest | 被绑定的摘要值 | 必须与本地对原始文件算出的摘要逐字节一致 |
| Serial number | TSA 分配的流水号 | 唯一可查,用于对账与争议举证 |
| Time stamp | TSA 给出的签名时间 | 以 TSA 时钟为准,注意时区换算与对时要求 |
时间戳只能证明「摘要在该时刻已存在」:它不证明内容正确,也不证明数据由谁产生。要绑定来源,仍需签名,两者一起看才构成完整证据链。
校验前先确认 TSA 证书链可信:按 RFC 3161 要求,TSA 签名证书的扩展密钥用法应为时间戳用途且标记为关键。随手拿一份陌生 .tsr 用公共根去验,可能验到伪造的 TSA,等于替对方背书。
要做长期验证(LTV),归档时必须同时保留时间戳令牌、TSA 证书链与吊销信息。只留一个 .tsr,几年后 TSA 证书过期或链更新,签名有效也无法完成完整验证。