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