有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有一段代码,它调用了一个受证书保护的rest api,在我将应用程序从Wildfly 10迁移到Wildfly 16之前,这段代码已经正常工作了一段时间

代码本身很简单,它创建http请求并设置自定义socket工厂:`

 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: Failed to load .p12 keystore:C:\Cert\cert.p12; error constructing MAC: java.lang.SecurityException: JCE cannot authenticate the provider BC; org.bouncycastle.jcajce.provider.keystore.pkcs12.PKCS12KeyStoreSpi.engineLoad::-1 java.security.KeyStore.load in KeyStore.java::1445

我检查了bouncy castle库,但我在应用程序本身中没有它。。。 如果有人知道问题可能是什么,我将不胜感激

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


共 (1) 个答案

  1. # 1 楼答案

    回答我自己的问题。 类似于“JCE无法验证提供程序BC”的错误消息表明安全提供程序加载的jar文件无法通过JVM验证。jar未签名或签名无法验证。在我的例子中,较新的Wildfly版本有一个较新版本的bouncy castle库,由于某些原因,它无法通过Java8进行验证。很有趣,Java 10也可以。互联网上的一些人说,这个问题只发生在Oracle的JVM中,开放JDK不存在,我还没有测试过,只是觉得值得一提

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

    保安。供应商。11=组织。蹦蹦跳跳。jce。供应商。BouncyCastleProvider

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