Java实现的TSP、OCSP和CMS

3

我正在尝试理解Java数字签名的API。

我应该使用自定义加密提供程序来组成数字签名。我知道如何使用此CSP签署文档并获取分离的签名,现在我需要向此签名添加时间戳和证书状态(以使签名对政府机构有效)。这些内容使用TSP和OCSP完成。

问题:

  1. 我应该从哪里获取TSP客户端?
  2. 我是否正确地使用内置的Java OCSP支持来验证证书?
  3. TSP和验证信息是否与CMS有所关联?
  4. 最后也是最有趣的:我应该如何处理时间戳信息和证书验证信息:它们将是分离的文件还是签名的一部分?
2个回答

3

如何获取TSP客户端?

如果要使用CMS、TSP和OCSP,您可能需要查看Bouncy Castle。除了主要包和补充的CMS和TSP包外,它们还支持所有这些内容。

我是否正确地使用了内置的Java OCSP支持来验证证书?

尽管标准的PKIX证书验证机制支持OCSP,但将例如Bouncy Castle OCSP代码集成为自定义PKIXCertPathChecker可能是有意义的。您可以将其添加到现有验证之上,也可以将其作为全面替代品,具体说明可在此处找到。我们遇到了通过代理连接时使用内置OCSP支持出现问题的情况,因此过去我们使用了这种技术来替换默认设置。

TSP和验证信息是否与CMS相关联?

TSP服务器发送给您的时间戳响应仅是另一种CMS SignedData,因此本身又是一种签名。为了避免无数的单独文件,您通常使用CMS的未签名属性功能将时间戳包含在原始签名中。您只需将时间戳作为未签名签名属性添加到SignerInfo的unsignedAttrs字段中,从而将单独文件最小化为只有一个文件——签名本身,它嵌入了所有附加信息在signedAttrs和unsignedAttrs字段中。

最后也是最有趣的问题:我应该如何处理时间戳信息和证书验证信息:它们是独立的文件还是签名的一部分?

我已经描述过时间戳;验证信息(例如CRL和OCSP响应)可以嵌入SignedData的“crls”字段中。您可以随时添加这些内容,而不会破坏实际签名——这些内容以及未签名属性不会对生成或验证签名产生影响。

如果您仅使用CMS(RFC 5652)嵌入信息,则最终将得到一个相当专有的方案。根据您的需要,这可能已经足够好了。但是,如果您需要更多的互操作性,您可能需要查看CAdES(ETSI TS 101 733),这是一个免费的ETSI标准,可在http://pda.etsi.org上下载。该标准提供了有关如何嵌入其他签名数据(例如时间戳和吊销信息)的更多信息。


也许你能回答我的问题(我猜你在密码学方面的问题上很有经验): 我正在实现CAdES-X Long Type 1,在SignerInfo签名属性中,有一个强制性属性称为SigningCertificateV2。SigningCertificateV2 :: = SEQUENCE { certs SEQUENCE OF ESSCertIDv2, policies SEQUENCE OF PolicyInformation OPTIONAL } PolicyInformation :: = SEQUENCE { policyIdentifier CertPolicyId, policyQualifiers SEQUENCE SIZE (1..MAX) OF PolicyQualifierInfo OPTIONAL } 也许你知道在哪里可以找到PolicyInformation的源代码? - pls
1
不用谢!PolicyInformation是可选的,据我所知,在CAdES签名中没有使用。 - emboss

2
我建议如果您正在寻找Java密码学相关提供程序,可以使用BouncyCastle(http://www.bouncycastle.org/java.html)。
引用自其网站:
- OCSP(RFC 2560)的生成器/处理器。 - TSP(RFC 3161和RFC 5544)的生成器/处理器。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接