openSSL 验证使用自签名证书签名的 RFC 3161 TimeStampResp

openSSL verify RFC 3161 TimeStampResp signed with self-signed certificate

我使用 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

生成了以下输出:

Status info:
Status: Granted.
Status description: unspecified
Failure info: unspecified
TST info:
Version: 1
Policy OID: tsa_policy1
Hash Algorithm: sha256
Message data:
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*w.n.a|....
Serial number: 0x01
Time stamp: Aug 1 13:40:03 2018 GMT
Accuracy: 0x01 seconds, 0x01F4 millis, 0x64 micros
Ordering: yes
Nonce: unspecified
TSA: DirName:/C=stuff/ST=Some-State/L=stuff/O=stuff/CN=stuff
Extensions:

当我尝试使用此命令根据 TimeStampReq 验证 TimeStampResp 时:

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

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

Verification: FAILED
139727615005120:error:2F06D064:time stamp routines:ts_verify_cert:certificate verify error:../crypto/ts/ts_rsp_verify.c:182:Verify error:self signed certificate

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

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

其次,如果我在所有最新版本 (1.0.0-2,1.1. 0).我所能建议的是,仔细查看您的证书中的确切内容。一种明显的可能性:您是否将 TSA 名称(证书主题)设置为与 CA 名称相同?这会使链接失败,导致您遇到的验证错误类型。

第三,openssl ts -verify中除了正常的验证顺序外没有其他选项。但成功的 TimeStampResp 只是一个包含简单 header(包含 INTEGER 0 的 sub-SEQUENCE)和 CMS SignedData(即时间戳记号)的序列。您可以提取 CMS SignedData 部分——手动使用 openssl asn1parse -inform d 找到它的偏移量,通常是 9,然后添加 -strparse 9 -out signedtst 或简单的东西,例如 tail -c +10 <tsresp >signedtst (added) 或更容易地使用我之前不知何故错过的选项:openssl ts -reply -in response -token_out -out signedtst - 然后使用

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

(yes -verify -noverify!) 验证证书(即 TSA)对签名数据的签名,但不验证证书本身(针对以信任库结尾的链,以及所需的 ExtKeyUsage ,加上 OpenSSL 的 -purpose timestampsign 也限制了 KeyUsage,虽然我在标准中没有看到这个)并且还提取了签名的 body 然后你可以用

手动解析
openssl asn1parse -inform der -in tstinfo [-i]

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

添加:我显然错过了 1.1.0 中的一些添加选项;见 https://whosebug.com/a/52134401/2868801