禁用类证书信息检查(Java)

5
我创建了一个库,可以直接将一个jar加载到当前类路径中,以启动其中的一个类。但被注入的jar包含证书,所以我遇到了以下错误:
java.lang.SecurityException: class "TestClass" signer information does not match signer information of other classes in the same package

这是正常的,但我无法摆脱它。因为两个不同的 jar 包“冲突”,所以这是正常的,但是,我无法删除 JAR 的证书,因为它是第三方的。

那么,我可以禁用类证书检查吗?或者做些什么来摆脱这个错误?

我认为我需要重写 ClassLoader.checkCerts 方法...但这很麻烦...

1个回答

4
如果您想同时使用两个版本或两个实现的库,例如为升级处理的一部分,则需要使用ClassLoaders。
当需要解析一个Class时,标准Java ClassLoaders首先询问它们的父ClassLoader(即加载它们的那个),以获取该类,只有在父级找不到时才会尝试自行加载。这种“优先使用父级”方法可以提供安全性(因为加载的类无法覆盖)和稳定性(因为不能同时使用相同类的两个版本)。许多应用程序容器使用不同的方法来避免容器的实现影响其包含的应用程序的实现。
要在同一应用程序中使用两个版本的库(例如V1和V2),您需要至少使用两个ClassLoaders。
我认为最干净的实现方式是从应用程序的标准类路径中省略对V1和V2的所有提及。然后,您创建两个ClassLoader实例,一个用于V1及其依赖项,另一个用于V2及其依赖项。当任何一个版本运行时,另一个版本不在类路径上,因此没有冲突。不幸的是,“干净”的实现并非总是可能的。
如果大部分应用程序继续使用V1,而其中的某些部分使用V2,则需要使用允许您覆盖加载顺序的类加载器,以使其类优先于父级的类。我在https://github.com/kamranzafar/JCL上找到了这样的实现。JCL允许您设置类和资源的搜索顺序,并将自动为您创建代理,以便您无需使用反射来处理V2代码。
请注意,JCL文档没有提到应在配置它之后使用其JarClassLoader类上的“initialize”方法,然后再使用它。
有一些事情您不能使用ClassLoaders做到:
1.如果您试图替换一个已签名的类,则这将违反签名的精神,因此您不能这样做。这意味着您必须创建自己的未签名jar。
2.如果您试图替换加密库中的已签名类,则可能会创建安全漏洞,因此您可能需要使用自己的签名密钥或甚至是由Oracle认证的签名密钥对库进行签名,因为JRE非常挑剔,只允许某些人加载加密类。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接