当前位置: 首页 > 知识库问答 >
问题:

使用自定义JCE安全提供程序而不进行签名

都乐逸
2023-03-14

我们有我们的定制JCE安全提供商,它使用我们的智能卡进行加密操作。

当我们试图使用某些类,如Cipher、KeyAgreement、KeyGenerator、Mac或SecretKeyFactory时,就会出现问题。

Java抛出异常:

Exception in thread "main" java.security.NoSuchProviderException: JCE cannot authenticate the provider Foo

我在这里和这里读到,如果您试图使用自定义JCE安全提供程序进行加密,则必须对其进行签名。这是因为一些政府制定了一些有关密码的法律。

我还阅读了这篇文章:如何签署自定义JCE安全提供商

建议是向Oracle发送一些有关您公司/产品的信息,并发送csr,以便他们可以颁发一个可用于代码签名的证书,该证书的有效期为5年。

我的问题是,有没有办法为了测试的目的绕过这个问题?例如,通过更改一些策略或自签名JAR。我们尝试了自签名JAR,但没有成功,也许我们做错了什么。

有没有人在没有获得Oracle证书的情况下幸运地克服了这个问题?

最后,我们将申请证书,但我了解到,可能需要10天才能得到回复,我们需要这个来进行测试。

共有1个答案

郑波
2023-03-14

是的,您可以做的是修补JarVerifier。jce中的类文件。罐子Jce。jar是JRE/JDK的一部分(取决于您是否只安装了运行时环境或开发工具包)。这种方法很乏味,而且很复杂,但它是确保您不接触jar验证代码之外的任何其他代码的最佳方法。

对于这些步骤,您需要安装JDK以及十六进制编辑器。

在我的Windows安装上,例如jce。jar位于C:\Program Files\Java\jdk1.8.0\U 77\jre\lib\jce。罐子

找到后,在zip文件编辑器(例如WinZip、7zip)中打开jce.jar。导航到javax\crypto\并将JarVerifier.class解压缩到您的桌面或其他所需的位置以处理它。此外,制作此文件的备份副本!!

现在侦探工作来了。打开一个终端和cd,将JarVerifier提取到其中。班运行以下命令:javap-cjarverifier。类别

这将显示类文件中代码的重构Java字节码版本。您将看到一个名为void verify()的方法抛出。。。JarException

在我的JRE版本中,验证()的代码开头如下:

aload_0
getfield #15
ifnonnull 17
new #20

verify方法的工作原理是,如果给定的jar没有正确签名,则使用异常通知调用方法。如果没有抛出异常,则假定一切正常,可以使用JCE提供程序。我们可以通过简单地将verify()方法的第一条指令更改为返回的op代码来利用这一点。

将此Java字节码说明网页作为参考:https://en.m.wikipedia.org/wiki/Java_bytecode_instruction_listings.我们希望找到这一指令序列在JARVifier中的确切位置。类文件,因此我们需要将之前由javap打印的字节码转换为十六进制数。然后,我们将在JarVerifier中搜索这一串数字。类来查找verify()方法的确切位置。

所以...使用维基百科页面作为参考,它是这样的:

  • aload\u 0:2A
  • getfield#15:B4 00 0F
  • 如果非空17:<代码>C7

计算分支偏移量有点繁琐,我们在搜索中不需要它。

现在,搜索以下十六进制字节字符串:2AB4000FC7。在我的JRE版本中,只有一个匹配项。验证C7后2个字节是否也存在BB 00 14,以确保这确实是Verify()方法。

最后,补丁。返回的操作码是B1。只需将代表aload\u 0的2A替换为值B1即可。在我的版本中,这是在偏移量0x2938处。现在,verify()所做的就是返回!

保存文件,退出,并在新的JarVerifier.class文件上运行上面的javap命令,以查看您的更改结果。您应该看到验证()中的第一条指令是返回

使用上面的zip文件编辑器,替换JarVerifier。jce内部的类。jar与您的修改版本。如有必要,保存jar文件。

就是这样!已禁用JCE jar验证。

 类似资料:
  • 问题内容: Sun的PKCS11 JCE安全提供程序缺少我们需要的某些功能。 因此,我使用原始资源编写了它的增强版本。 不幸的是,JCE基础结构拒绝新的提供者 “ JCE无法验证提供者”, 因为它没有正确签名。 抛出。 (呼叫) 关于如何签署新提供商以使其与JCE一起工作的任何建议? 问题答案: 该过程在文档“如何实现 提供者”中进行了描述。 它涉及到电子邮件 太阳向Oracle提供一些信息(包括

  • JCA提供者提出的解决方案是将JAR放在jre/lib/ext文件夹中,但不是从那里加载的。据我所知,这是由于OSGi(Eclipse equinox)类加载器策略将bootstrap类加载器作为每个bundle类加载器的父类,从而排除了从jre/lib/ext文件夹加载的扩展类加载器。即。在jre/lib/ext文件夹中没有一个bundle可以看到任何东西。 是否有一种方法可以让Eclipse

  • 我的配置是: < li>Grails框架3.0.11 < Li > " org . grails . plugins:spring-security-core:3 . 0 . 3 " < Li > " org . grails . plugins:spring-security-oauth 2-provider:3 . 0 . 0-RC1 " 我已经指定了我的自定义用户详细信息服务(实现Grail

  • 我有一个使用bouncycastle库的Java applet。当我在Eclipse上运行应用程序时,一切正常,但当我在带有标记的浏览器上使用applet时,当我添加安全BouncyCastleProvider时,它会引发异常。 我的stackTrace是: 我正在使用bcpkix-jdk15on-1.48.jar和bcprov-jdk15on-1.48.jar版本的BouncyCastle。为什

  • 我正在使用Symfony Security和系统中的自定义用户提供程序。它通过web服务为用户提供服务。 我根据本教程配置提供程序(http://symfony.com/doc/current/cookbook/security/custom_provider.html). 这里是检查用户的功能: 这很好,函数使用用户名调用一个web服务,然后返回一个包含用户数据的数组。但是现在我需要通过另一个w

  • 我想为Spring Security配置L 我配置spring-security.xml指出m 如何设置为 Spring,使用我的自定义类而不是他的 deafaul LDAP 身份验证提供程序?