java - 使用自定义类加载器加载安全类
问题描述
我们正在创建一个基于 javassist 的自定义类加载器,在加载时修改一些类字节码。该项目的一部分也是一个包含安全提供程序的签名 jar。
Loader 的初始化简单如下:
private final Loader initLoader(ClassLoader master) {
final ClassPool pool = ClassPool.getDefault();
final Loader loader = new Loader(master, pool);
try {
loader.addTranslator(pool, new MyTranslator());
} catch (Exception e) {
e.printStackTrace();
}
return loader;
}
该类MyTranslator
进行修改,但不关心与安全相关的类。是master
系统(父)类加载器。
当应用程序在加载相关安全类时进入该部分时,将引发此异常:
Caused by: java.security.NoSuchProviderException: JCE cannot authenticate the provider EXAMPLE-PROV
at javax.crypto.JceSecurity.getInstance(JceSecurity.java:100) ~[?:1.8.0_121]
at javax.crypto.KeyAgreement.getInstance(KeyAgreement.java:230) ~[?:1.8.0_121]
at my.example.app.security.ExampleKeyAgreement.generateSharedSecret(ExampleKeyAgreement.java:56) ~[?:?]
... 22 more
Caused by: java.util.jar.JarException: Class is on the bootclasspath
at javax.crypto.JarVerifier.verify(JarVerifier.java:286) ~[?:1.8.0_121]
at javax.crypto.JceSecurity.verifyProviderJar(JceSecurity.java:159) ~[?:1.8.0_121]
at javax.crypto.JceSecurity.getVerificationResult(JceSecurity.java:185) ~[?:1.8.0_121]
at javax.crypto.JceSecurity.getInstance(JceSecurity.java:97) ~[?:1.8.0_121]
at javax.crypto.KeyAgreement.getInstance(KeyAgreement.java:230) ~[?:1.8.0_121]
at my.example.app.security.ExampleKeyAgreement.generateSharedSecret(ExampleKeyAgreement.java:56) ~[?:?]
我的问题是,是否有办法从自定义类加载器加载这些类而不违反 java 安全机制?
方法javassist.Loader#setDomain(ProtectionDomain)
说
如果不注册适当的保护域,则此加载程序加载的程序将无法与安全管理器或签名的 jar 文件一起使用。
如何创建或确定有效ProtectionDomain
实例?
解决方案
推荐阅读
- excel-formula - 查找一个单元格相似而另一个单元格与另一行不同的行
- acumatica - Acumatica 覆盖方法 - 扫描和接收屏幕
- canvas - 将 Video.js 插件的高度相应地调整为固定宽度
- python - python函数.size()的sql等效函数是什么?
- react-native - IDE 无法识别 Jest 及其功能
- spring - 关于 alb 和 spring boot sockjs
- sql - 获取 Oracle SQL 的 13 周移动平均值
- java - 监控 Kafka Consumer Lag 并生成警报
- python - 如何处理包含多个 csv 文件的数据集?
- c# - 有没有办法重复上一个“快速动作”?