使用PKIStatus值验证RFC 3161时间戳响应

时间:2017-07-26 09:31:36

标签: java cryptography timestamp digital-signature bouncycastle

我有一个SOAP请求,需要重新设计,因为SoapUI无法正确处理二进制响应。 我决定让它基于Java。我发现this非常有用,但不确定,代码片段中的函数是如何产生的。我有

  • 的DigestValue
  • 的SignatureValue
  • x509证书

SOAP请求中定义,并且不确定如何转换这些信息以将请求发送到我的tsendpint。 我也尝试了TSAClientBouncyCastle,但不确定为什么我们需要登录凭据。我把这些字段留空,但它一直用

完成
  

TSAClientBouncyCastle @ 1f0e140b

消息。

我使用构造函数从TSAClientBouncyCastle调用Main类。

它是主要部分,它应该解码数据。

   // Get TSA response as a byte array
    InputStream inp = tsaConnection.getInputStream();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    byte[] buffer = new byte[1024];
    int bytesRead = 0;
    while ((bytesRead = inp.read(buffer, 0, buffer.length)) >= 0) {
        baos.write(buffer, 0, bytesRead);
    }
    byte[] respBytes = baos.toByteArray();

    String encoding = tsaConnection.getContentEncoding();
    if (encoding != null && encoding.equalsIgnoreCase("base64")) {
        respBytes = Base64.decode(new String(respBytes));
    }

1 个答案:

答案 0 :(得分:1)

时间戳管理局(TSA)生成证据,证明在特定时间之前存在数据。它使用RFC3161中定义的协议和格式。

时间戳响应如下(见RFC3161-section 2.4.2):

TimeStampResp ::= SEQUENCE  {
  status                  PKIStatusInfo,
  timeStampToken          TimeStampToken     OPTIONAL  }

您可以使用BouncyCastle解析内容类型application/timestamp-reply的回复,以获取PKIStatusInfo

TimeStampResponse response = new TimeStampResponse(tsaInputStream);
int status = response.getStatus();

可能的值是

PKIStatus ::= INTEGER {
  granted                (0),
  -- when the PKIStatus contains the value zero a TimeStampToken, as
     requested, is present.
  grantedWithMods        (1),
   -- when the PKIStatus contains the value one a TimeStampToken,
     with modifications, is present.
  rejection              (2),
  waiting                (3),
  revocationWarning      (4),
   -- this message contains a warning that a revocation is
   -- imminent
  revocationNotification (5)
   -- notification that a revocation has occurred  }