我的时间戳提供程序最近从使用rsaEncryption签名时间戳令牌到rsassaPss (请参阅此处asn1parse的差异)。
在更改之前,我在OpenSSL中使用了以下命令(v1.1.1a)来验证时间戳令牌:
$ openssl ts -verify -partial_chain -in token-rsaencryption.der -token_in \
> -digest bcbfcee484a9b243bafad6b8a43e0ddc1bf091837463e7c717495395eefbc2a6 \
> -CAfile cert.pem -untrusted cert.pem
Verification: OK
Using configuration from C:/Program Files/Git/mingw64/ssl/openssl.cnf但是,命令不再工作了。
$ openssl ts -verify -partial_chain -in token-rsassapss.der -token_in \
> -digest 00017f0b41ce9649602a0218cd02ed0b0a3d93130329451cc782b7dfda79ce71 \
> -CAfile cert.pem -untrusted cert.pem
Verification: FAILED
Using configuration from C:/Program Files/Git/mingw64/ssl/openssl.cnf
14548:error:0407008A:rsa routines:RSA_padding_check_PKCS1_type_1:invalid padding:../openssl-1.1.1a/crypto/rsa/rsa_pk1.c:67:
14548:error:04067072:rsa routines:rsa_ossl_public_decrypt:padding check failed:../openssl-1.1.1a/crypto/rsa/rsa_ossl.c:582:
14548:error:21071069:PKCS7 routines:PKCS7_signatureVerify:signature failure:../openssl-1.1.1a/crypto/pkcs7/pk7_doit.c:1037:
14548:error:2F06A06D:time stamp routines:TS_RESP_verify_signature:signature failure:../openssl-1.1.1a/crypto/ts/ts_rsp_verify.c:143:这可能是因为RSASSA 在使用OpenSSL的时间戳验证中还不支持.
还有其他选项可以用RFC3161验证rsassaPss令牌吗?
如果您想查看这些文件,那么时间戳标记(rsaEncryption和rsassaPss)和签名证书https://github.com/openssl/openssl/files/2808239/openssl-issue-7904.zip。
发布于 2022-03-03 12:32:12
已经有一段时间了,但这个问题仍然存在。
关键是RSASSA是为CMS_* API函数实现的,而不是为PKCS7_*实现的。您也可以在命令行中看到这一点。由于时间戳令牌基本上是一个TSTInfo的PKCS#7/CMS TSTInfo,所以您可以只验证签名:
$> openssl smime -verify -noverify -inform der -content foo -in foo.tst -out foo.tst.smime_verify
Verification failure
16432:error:21071065:PKCS7 routines:PKCS7_signatureVerify:digest failure:.\crypto\pkcs7\pk7_doit.c:1114:
16432:error:21075069:PKCS7 routines:PKCS7_verify:signature failure:.\crypto\pkcs7\pk7_smime.c:400:
$> openssl cms -verify -inform der -in foo.tst -noverify -out foo.tst.cms_verify
Verification successful时间戳验证最终可以归结为PKCS7_signatureVerify(...)..。
您询问了OpenSSL CLI,据我所知,这是没有解决方案的。由于我们仍然使用API (甚至1.0.2u!^^),下面是我得出的结论:
我从ts/ts_rsp_verify.c复制了static int int_TS_RESP_verify_token(...)。您将注意到总共有8种不同的检查来验证时间戳令牌,第一种是签名验证。其中对TS_RESP_verify_signature(...)的调用基本上可以归结为PKCS7_signatureVerify(...)。然后,我将TS_RESP_verify_signature(...)替换为CMS_verify(...) (需要做一些准备),从而获得了启用时间戳令牌验证的RSASSA。
https://stackoverflow.com/questions/54425033
复制相似问题