正在Wildfly 16中的应用程序中加载pk12文件



我有一个代码,它调用了一个用证书保护的rest api,该代码运行了一段时间,没有出现问题,直到我将应用程序从Wildfly 10迁移到Wildfly 16。

代码本身是直接的,它创建http请求并设置自定义套接字工厂:`

private SSLSocketFactory getSSLSocketFactory() {
char[] certPassword = {}; // password hidden from you 
try {
final KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
final SSLContext sslContext = SSLContext.getInstance("TLS");
final KeyStore keyStore = KeyStore.getInstance("PKCS12");
try (FileInputStream fileInputStream = new FileInputStream(new File("cert.pk12"))) {
keyStore.load(fileInputStream, certPassword);
} catch (final Exception e) {
logger.error("....", e);
}
this.readLoadCertificateFile(keyStore);
kmf.init(keyStore, certPassword);
sslContext.init(kmf.getKeyManagers(), new TrustManager[]{new AnyTrust()}, null);
return sslContext.getSocketFactory();
} catch (Exception e) {
logger.error(".....", e);
}
throw new IllegalStateException("....");
}

HTTPRequest req = ....
req.setSSLSocketFactory(getSSLSocketFactory());
tokenHttpResp = req.send();`

`

一切看起来都很好,但当我从WF16中运行此代码时,它会抛出

IOException:无法加载.p12密钥库:C:\Cert\Cert.p12;错误构造MAC:java.lang.SecurityException:JCE无法进行身份验证提供者BC;org.bouncycastle.jcajce.provider.keystore.pkcs12.PKCS12KeyStoreSpi.engineLoad::-1KeyStore.java::1445 中的java.security.KeyStore.load

我检查了弹性城堡库,但应用程序本身没有它。。。如果有人知道问题可能是什么,我将感谢任何意见。

或者,我想把这个套接字工厂的创建转移到容器本身,看起来像是专门为此设计的Wildfly Elytron子系统,这是个好主意吗?

回答我自己的问题。类似">JCE无法验证提供程序BC"的错误消息表明JVM无法验证从中加载安全提供程序的jar文件。jar没有签名或者签名无法验证。在我的案例中,较新的Wildfly版本有一个较新版本的弹性城堡库,由于某种原因,它无法通过Java8进行验证。有趣的是,它可以与Java 10配合使用。网上有人说这个问题只发生在Oracle的JVM中,Open JDK不存在,我还没有测试过,只是觉得值得一提。

为了克服这个问题,您需要告诉JVM信任安全提供程序,为此,请确保您想要使用的安全提供程序/JVM决定使用,如jre/lib/security/java.security文件中所述,它应该有如下行:

security.provider.11=org.bouncycastle.jce.provider.BuncyCastleProvider

然后将带有安全提供程序的Jars复制到/jre/lib/ext文件夹中

相关内容

  • 没有找到相关文章

最新更新