我使用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是68 2a 77 f6-6e 96 61 7c bf 8f e2 cd。| ..h * w.n.a | ....
序列号:0x01
时间戳记:2018年8月1日13:40:03 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可以信任?
答案 0 :(得分:1)
首先,这实际上不是编程或开发问题,而probalby属于超级用户,unix.SX或也许是security.SX。
第二,如果我在所有最新发行版(1.0.0-2,1.1.0)上使用“显而易见”的默认值重构了您所省略或编辑的信息的情况,则对我有用(验证没问题)。我只能建议您仔细查看证书中的内容。一种明显的可能性:您是否将TSA名称(证书使用者)与CA名称相同?这会使链接失败,从而导致出现您遇到的验证错误。
第三,openssl ts -verify
中除了正常的验证序列外没有其他选择。但是成功的TimeStampResp是一个SEQUENCE,它包含一个包含INTEGER 0的子SEQUENCE,以及一个CMS ContentInfo,它包含具有某些约束的SignedData。您可以提取CMS SignedData部分-使用openssl asn1parse -inform d
来查找其偏移量(通常为9),然后添加-strparse 9 -out signedtst
或类似tail -c +10 <tsresp >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