我正在使用一个签名的小程序,它添加了一个新的提供程序。如果小程序已签名,则认为此类代码是可信的。
在私有方法中:
private Provider addProvider() throws Exception {
logger.log(Level.INFO, "addProvider ... ");
Provider p = new sun.security.pkcs11.SunPKCS11(
new ByteArrayInputStream(config.getBytes())
);
//Security.addProvider(p);
return p;
}
config
是一个字符串,其中包含 PKCS11 的名称和库。
当我使用 netbeans 调试时,applet 可以完美运行并添加了新的提供程序,但是当我在 html 文件中执行 applet 时,applet 没有初始化。如果我取消注释下添加提供程序的行,则 html 中的小程序将被初始化。
private Provider addProvider() throws Exception {
logger.log(Level.INFO, "addProvider ... ");
//Provider p = new sun.security.pkcs11.SunPKCS11(
// new ByteArrayInputStream(config.getBytes())
// );
// Security.addProvider(p);
return p;
}
然后添加提供程序时出现问题。
只有这一行导致小程序未初始化:
Provider p = new sun.security.pkcs11.SunPKCS11(
new ByteArrayInputStream(config.getBytes())
);
我插入了一个try {}
private Provider addProvider() throws Exception {
logger.log(Level.INFO, "addProvider ... ");
try{
Provider p = new sun.security.pkcs11.SunPKCS11(
new ByteArrayInputStream(config.getBytes())
);
Security.addProvider(p);
} catch (Exception ex) {
logger.log(Level.SEVERE, "Excepcion provider: {0}", ex);
}
return p;
}
但是就像小程序没有初始化我没有得到任何异常有什么建议吗?
感谢安德鲁的评论。
我已经添加了你的建议,现在我收到了一个错误:
try{
provider = new sun.security.pkcs11.SunPKCS11(
new ByteArrayInputStream(config.getBytes())
);
Security.addProvider(provider);
} catch (Throwable t) {
logger.log(Level.SEVERE, "Excepcion provider:", t);
logger.log(Level.SEVERE, "Throwable.Cause: ", t.getCause());
}
日志显示:
例外供应商:
<message>java.lang.ExceptionInInitializerError</message>
Throwable.Cause:java.security.AccessControlException:访问被拒绝(java.lang.RuntimePermission accessClassInPackage.sun.security.util)