如何签署自定义JCE安全提供程序

Sun的PKCS11 JCE安全提供程序缺少我们需要的一些function。
所以我使用原始资源编写了一个增强版本。

不幸的是,JCE基础设施拒绝新的提供商
“JCE无法validation提供商”
因为没有正确签名。

javax.crypto.JceSecurity.verifyProviderJar(...)抛出。
(它调用javax.crypto.JarVerifier.verify()

有关如何签署新提供商以使其与JCE一起使用的任何建议?

该过程在文档“如何实现提供者”中描述。

它涉及向Sun Oracle发送一些信息(包括您为签名密钥生成的CSR),然后传真确认文档。 获取签名证书可能需要一周或更长时间,因此请提前计划。

如果提供商提供受某些(压制性)政府限制的服务,则只需签署提供商。 例如, Cipher实现是受限制的“服务”,而MessageDigest是不受限制的服务。 我假设您收到的消息是,您正在尝试提供受限制的服务。

如果您提供任何这些服务, 则无法解决此问题:您需要Sun颁发的代码签名证书。 (IBM的一个也可能会工作;如果我没记错的话,他们的代码签名CA是受支持的,但我对他们的发布过程一无所知。)

另一种方法是使用OpenJDK设计自定义提供程序。 这是由Sun / Oracle赞助的开源项目,并为其正式发布提供代码库。 OpenJDK不要求提供者签名。 OpenJDK在几个Linux发行版上可用(现在默认情况下)。 不幸的是,它似乎不适用于Windows或Macintosh。 如果您运行的是Windows或Macintosh,我建议将Linux安装到VM中。

但是,如果必须在Windows或Mac上进行开发,则可以通过官方安装的jce.jar(在Java lib目录中)从OpenJDK安装复制jce.jar文件。 这将有效地绕过Jar身份validation过程。 但是,当你完成开发时,一定要把原来的jce.jar文件放回去。

您必须使用“JCE Code Signing CA”对JAR进行签名。 在所有当前的Java发行版中,只有2个CA(Sun和IBM)是内置的(硬编码),并且无法添加自己的CA. 我们试图与Sun合作签署我们的提供商,这几乎是不可能的。 他们不会发出中间CA证书,这意味着每次进行更改时都必须经历麻烦。

你为什么不只是用自己的图书馆? 您可以使用标准API实现不同JCE之间的互操作性。 但是现在对于CryptoKi / SmartCard的东西来说这是不现实的,你几乎总是需要编写一些自定义代码来与供应商特定的API进行交互。 您甚至可以使代码模仿JCE API以最小化代码更改。

仅仅为了额外的信息,当我使用选项“将所需的文件库提取到生成的JAR中”而不是正确的“将所需的库打包到生成的JAR”中构建JAR(Eclipse Juno)时,我遇到了同样的exception。