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

时间:2009-11-18 15:30:55

标签: java security digital-signature jce

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

不幸的是,JCE基础设施拒绝了新的提供商 “JCE无法对提供商进行身份验证”
因为没有正确签名。

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

有关如何签署新提供商的任何建议 与JCE合作?

5 个答案:

答案 0 :(得分:9)

该过程在文档"How to Implement a Provider."

中描述

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

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

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

仅仅为了额外的信息,当我构建一个带有“将所需的库提取到生成的JAR”选项的JAR(Eclipse Juno)而不是正确的“将所需的包打包到生成的JAR中”时,我得到了同样的异常

答案 4 :(得分:0)

好吧,在阅读了与某些 Oracle 权限的握手之后,我的解决方案是编写一个具有自己签名验证的独立 Cipher 类,如果“我”以外的其他提供者委托给 {{1 }}。

这似乎是强制性的,因为在所有 Java 版本中几乎没有可用的算法,而且某些算法的强度限制也不令人满意,而且本质上,Oracle 不需要知道我的加密算法。