我正在尝试理解Java数字签名的API。
我应该使用自定义加密提供程序来组成数字签名。我知道如何使用此CSP签署文档并获取分离的签名,现在我需要向此签名添加时间戳和证书状态(以使签名对政府机构有效)。这些内容使用TSP和OCSP完成。
问题:
- 我应该从哪里获取TSP客户端?
- 我是否正确地使用内置的Java OCSP支持来验证证书?
- TSP和验证信息是否与CMS有所关联?
- 最后也是最有趣的:我应该如何处理时间戳信息和证书验证信息:它们将是分离的文件还是签名的一部分?
我正在尝试理解Java数字签名的API。
我应该使用自定义加密提供程序来组成数字签名。我知道如何使用此CSP签署文档并获取分离的签名,现在我需要向此签名添加时间戳和证书状态(以使签名对政府机构有效)。这些内容使用TSP和OCSP完成。
问题:
如何获取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上下载。该标准提供了有关如何嵌入其他签名数据(例如时间戳和吊销信息)的更多信息。