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

时间:2018-08-01 16:04:17

标签: openssl verification rfc3161

我使用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可以信任?

1 个答案:

答案 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