我有一个代码,该代码调用受证书保护的rest api,并且该代码运行了一段时间没有出现问题,直到我将应用程序从Wildfly 10迁移到Wildfly16。
代码本身很简单,它创建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 ::-1 KeyStore.java::1445中的java.security.KeyStore.load
我检查了充气城堡库,但应用程序本身没有它... 如果有人知道是什么问题,我将不胜感激。
或者,我希望将此套接字工厂创建的内容移入容器本身,似乎是Wildfly Elytron子系统专门为此设计的,这是个好主意吗?