我们遇到了BouncyCastle安全提供程序的问题。我们在两个不同的Web应用程序中使用它,但它们由一个单独的tomcat部署。 我们在java.security.Security-Class中的第1位注册了BC-provider。
两个webapps都找到了正确的SecurityProvider,但是第一个注册BC的webapp最初似乎拥有所有权'它的。
第二个webapp尝试加载密钥库,如下面的代码所示:
if (Security.getSecurityProvider("BC") == null){
keyStore = java.security.KeyStore.getInstance("PKCS12");
}else{
keyStore = java.security.KeyStore.getInstance("PKCS12", Security.getSecurityProvider("BC"));
}
keyStore.load(in, this.pin);
然后在keyStore.load(in, this.pin);
发生以下异常:
java.io.IOException:构造MAC时出错:java.security.InvalidAlgorithmParameterException:不恰当的参数类型:javax.crypto.spec.PBEParameterSpec 在org.bouncycastle.jcajce.provider.keystore.pkcs12.PKCS12KeyStoreSpi.engineLoad(PKCS12KeyStoreSpi.java:839) 在java.security.KeyStore.load(KeyStore.java:1445)
我们有这个问题,因为我们使用java8 / tomcat8 - java7 / tomcat7工作正常。 所以我们的假设是,这是由tomcat 8中类加载器机制的变化引起的。 在分离的tomcats中部署webapp不是我们的选择......
感谢您的帮助。
答案 0 :(得分:0)
我通过使用解决了这个问题
Provider provider = new BouncyCastleProvider();
代替
Provider provider = Security.getSecurityProvider("BC");
如果需要,您可以将实例化移动到静态字段以仅执行一次。考虑到这个问题花费了我多少时间,尝试使用正确的类加载器加载 BC 并且每次新安装都必须再次处理它,这非常简单。