1

我使用 openSSL 从 RFC 3161 TimeStampReq 生成了 RFC 3161 TimeStampResp。因此,我使用了自签名 CA 证书和自签名 CA 使用以下命令颁发的 TSA 证书:

openssl ts -reply -queryfile request.tsq -signer TSAcert.pem -out response.tsr

响应已创建。

openssl ts -reply -text -in response.tsr

生成以下输出:

状态信息:
状态:授予。
状态描述:未指定
失败信息:未指定
TST 信息:
版本:1
策略 OID:tsa_policy1
哈希算法:sha256
消息数据:
0000 - 43 2c bb 03 28 48 42 06-c0 c8 95 ee d8 32 9d 29 C,..(HB ......2.)
0010 - 09 7c 10 be 68 2a 77 f6-6e 96 61 7c bf 8f e2 cd .|..h*wna|....
序列号:0x01
时间戳:2013 年 8 月 1 日:40:03 2018 GMT
精度:0x01 秒,0x01F4 毫秒,0x64 微秒
订购:是随机数
:未指定
TSA:DirName:/C=stuff/ST=Some-State/L=stuff/O=stuff/CN=stuff
扩展名:

当我尝试使用以下命令针对 TimeStampReq 验证 TimeStampResp 时:

openssl ts -verify -queryfile request.tsq -in response.tsr -CAfile CAcert.pem -untrusted TSAcert.pem

我收到一条错误消息,指出我的 CAcert 是自签名的(这实际上是真的)

验证:失败
139727615005120:错误:2F06D064:时间戳例程:ts_verify_cert:证书验证错误:../crypto/ts/ts_rsp_verify.c:182:验证错误:自签名证书

有什么方法可以跳过证书验证或告诉 openSSL 这个 CA 可以信任?

4

1 回答 1

1

首先,这不是真正的编程或开发问题,probalby 属于超级用户、unix.SX 或 security.SX。

其次,如果我在所有最近的版本 (1.0.0-2,1.1.0) 上为您省略或编辑的信息重建您所描述的“明显”默认值,它对我有用(验证没问题)。我只能建议,仔细查看您的证书中的确切内容。一种明显的可能性:您是否使 TSA 名称(证书主题)与 CA 名称相同?这会使链接失败,从而导致您得到的验证错误类型。

openssl ts -verify第三,除了正常的验证序列之外别无选择。但是一个成功的 TimeStampResp 只是一个包含简单标头(包含 INTEGER 0 的子序列)和一个 CMS SignedData 的 SEQUENCE,它是 Timestamp Token。您可以提取 CMS SignedData 部分——手动openssl asn1parse -inform d找到它的偏移量,通常为 9,然后添加-strparse 9 -out signedtst或只是简单的东西(如tail -c +10 <tsresp >signedtst (添加)或更容易使用我之前以某种方式错过的选项:openssl ts -reply -in response -token_out -out signedtst——然后使用

 openssl cms -verify -noverify -certfile signercert -inform der -in signedtst -binary -out tstinfo

(是-verify -noverify的!)通过证书(即 TSA)验证签名数据上的签名,但不验证证书本身(针对以信任库结尾的链,以及所需的 ExtKeyUsage,加上 OpenSSL-purpose timestampsign也限制 KeyUsage 虽然我没有'在标准中看不到这一点)并提取签名的正文,然后您可以手动解析

openssl asn1parse -inform der -in tstinfo [-i]

尽管这不如为您标记和格式化那么方便。

补充:1.1.0 中有一些我显然错过的附加选项;见https://stackoverflow.com/a/52134401/2868801

于 2018-08-02T06:38:57.380 回答