首页/安全/加密与证书速查/openssl ts 时间戳(RFC 3161)

openssl ts 时间戳(RFC 3161)

ts 生成与校验 RFC 3161 时间戳请求与响应,用于代码签名与档案的「存在时间」证明;验证需要可信 TSA 证书链与原始请求数据。

加密与证书速查安全更新于 2026-10-13

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            # 链不全时补中间证书再验

时间戳响应逐字段读法

字段含义判读要点
StatusTSA 的受理结果granted 才算成功;rejection 说明策略或请求格式不被接受
Policy时间戳策略 OID应与 TSA 公布策略一致,审计时需要留档
Hash algorithm请求使用的摘要算法sha256 正常;仍出现 sha1 需确认是否满足合规要求
Message digest被绑定的摘要值必须与本地对原始文件算出的摘要逐字节一致
Serial numberTSA 分配的流水号唯一可查,用于对账与争议举证
Time stampTSA 给出的签名时间以 TSA 时钟为准,注意时区换算与对时要求
时间戳只能证明「摘要在该时刻已存在」:它不证明内容正确,也不证明数据由谁产生。要绑定来源,仍需签名,两者一起看才构成完整证据链。
校验前先确认 TSA 证书链可信:按 RFC 3161 要求,TSA 签名证书的扩展密钥用法应为时间戳用途且标记为关键。随手拿一份陌生 .tsr 用公共根去验,可能验到伪造的 TSA,等于替对方背书。
要做长期验证(LTV),归档时必须同时保留时间戳令牌、TSA 证书链与吊销信息。只留一个 .tsr,几年后 TSA 证书过期或链更新,签名有效也无法完成完整验证。

易错点

  • 把时间戳当作完整性校验:摘要来自本地,篡改后的文件重新取一次时间戳照样成立,必须与签名配合使用
  • 验证时漏写 -queryfile 或指向了另一份数据,摘要对不上却误判为「验过了」
  • TSA 证书链缺中间证书导致 verify 报错,图省事改成不校验证书,把全部保障一起丢掉
  • 继续用 SHA-1 生成请求,部分 TSA 已直接拒绝,且不满足多数合规条文
  • 只归档 .tsr 而丢掉原始请求与原始文件,后续无法复现验证,证据链断在最后一步

数据来源与参考

  • RFC 3161(时间戳协议)
  • OpenSSL 官方文档(ts)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌