У меня есть код, который вызывает api rest, защищенный сертификатом, и этот код некоторое время работал без проблем, пока я не перенес приложение из 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. и у меня его нет в самом приложении ... Если кто-нибудь знает, в чем проблема, я был бы признателен за любой вклад.
В качестве альтернативы, я собираюсь перенести создание фабрики сокетов в сам контейнер, похоже на подсистему Wildfly Elytron, специально разработанную для этого, это хорошая идея?