2

我正在尝试了解用于数字签名的 Java API。我应该使用自定义密码提供程序来组成数字签名。我知道如何使用此 CSP 签署文档并获得分离的签名,现在我需要在此签名中添加时间戳和证书状态(以使签名对政府机构有效)。这些事情是使用 TSP 和 OCSP 完成的。问题:

  1. 应该在哪里获得 TSP 客户端?
  2. 我对使用内置的 java OCSP 支持来验证证书就足够了吗?
  3. tsp 和验证信息是否与 CMS 有某种联系?
  4. 最后也是最有趣的:我应该如何处理时间戳信息和证书验证信息:它是分离文件还是签名的一部分?
4

2 回答 2

3

应该在哪里获得 TSP 客户端?

要使用 CMS、TSP 和 OCSP,您可能需要查看Bouncy Castle。它们支持主包以及补充 CMS 和 TSP 包中的所有内容。

我对使用内置的 java OCSP 支持来验证证书就足够了吗?

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

tsp 和验证信息是否与 CMS 有某种联系?

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

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

我已经描述过的时间戳;CRL 和 OCSP 响应等验证信息可以嵌入到 SignedData 的“crls”字段中。您可以在不破坏实际签名的情况下随时添加这些内容 - 这些内容以及未签名的属性将不会被考虑用于生成或验证签名。

如果您仅使用 CMS (RFC 5652) 嵌入信息,则意味着您最终会得到一个相当专有的方案。根据您的需要,这可能已经足够好了。但是,如果您需要更具互操作性的东西,您可能需要研究 CAdES (ETSI TS 101 733),这是一个免费的 ETSI 标准,可以在http://pda.etsi.org下载。该标准提供了有关如何正确嵌入附加签名数据(例如时间戳和撤销信息)的更多信息。

于 2011-10-09T03:12:32.197 回答
2

如果您正在研究与提供程序相关的 Java 密码学,我建议您使用 BouncyCastle (http://www.bouncycastle.org/java.html)。

引用它的网站:

  • OCSP 的生成器/处理器 (RFC 2560)。
  • TSP 的生成器/处理器(RFC 3161 和 RFC 5544)。
于 2011-10-09T02:57:26.240 回答