每个人。据我所知,在 JVM 中,有些类是签名的,有些不在同一个包下是不允许的。但是这个场景怎么样:我编写了一个 Java Web Start 应用程序,它只有一个像“test.jar”这样的 jar 文件。在 test.jar 中,我编写了一个自定义类加载器,它通过字节码(当然它们没有签名)从网络或硬盘加载类。运行时加载的字节码中的一些类位于 test.jar 中存在的同一个包下。这能行吗?另一个问题是 JVM 如何以及在何处检查哪些类已签名,哪些未签名,并且已签名的类由同一个签名者签名?我认为信息应该只是来自jar文件中的MANIFEST.MF文件,对于.class文件的内容,签名和未签名没有区别,对吧?谢谢。我对 JAR 签名机制不是很了解,但我想要。所以请帮助我,任何反馈都将非常感激。
问问题
710 次
1 回答
1
证书验证的实现存在于 Java 运行时的java.lang.Classloader类中。它不能仅仅被自定义类加载器覆盖,因为这个过程是作为模板设计模式实现的,证书验证过程是在私有方法中实现的 - checkCerts(String name, CodeSource cs),通过类的源。覆盖默认行为的一种可能机制是覆盖自定义类加载器中的 defineClass 方法;在我个人看来,我认为此选项充满风险(由于可能对安全模型产生影响),因此如果要执行此步骤,建议采取足够的预防措施。
很明显,运行时中的 Classloader 类是负责验证使用包的证书的一致性的类。该实现使用一个 Map 来存储证书,每个包一个,任何包的第一个加载类确定应该使用该包中存在的所有其他类的证书。
如果要允许同一个包中的不同类具有不同的签名者,那么我建议了解运行时中使用(和构建)的安全模型,因为影响可能不一定仅限于自定义 Classloader 类。
于 2011-05-05T03:11:55.380 回答