gpt4 book ai didi

java - 在运行时从资源设置默认的 Java SSLContext

转载 作者:搜寻专家 更新时间:2023-11-01 02:31:14 26 4
gpt4 key购买 nike

我的问题的基本组成部分是(上下文跟随代码片段)

  1. 以下代码是否是通过 -Djavax.net.ssl.keystore 设置默认 Java keystore 的有效替代方法?
  2. 除了更改默认 key 和信任管理器之外,此代码可能对受影响的 JVM 中的 SSL 行为产生什么影响
  3. 除了在运行时从资源设置默认信任/ key 存储之外,是否有更好的替代方法?

    KeyStore ks = KeyStore.getInstance("JKS");
    ks.load(testService.class.getClassLoader().getResourceAsStream("resources/.keystore"), "changeit".toCharArray());
    TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
    tmf.init(ks);
    KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
    kmf.init(ks, "changeit".toCharArray());
    SSLContext ctx = SSLContext.getInstance("TLS");
    ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
    SSLContext.setDefault(ctx);

围绕这个问题的上下文如下。我目前正在为具有相互证书身份验证的 Web 服务开发 CXF 客户端。出于各种原因,将客户端证书和 key 添加到默认 keystore 并不是一个理想的选择。理想情况下,我一直在寻找一种方法,将 keystore 作为资源文件包含在 JAR 中,并在需要时将其设置为运行时的默认值。我还想避免在每个对象的基础上配置每个客户端和/或连接,并且还支持诸如 JaxWsDynamicClientFactory 之类的操作(主要是为了“完整性”)。

我在互联网和 SO 上搜索了相关 Material 并找到了这些(onetwo)相关问题,但所提供的解决方案都不是我正在寻找的(尽管我确实将它们用作跳板开发上面的代码)。

现在,我意识到其他解决方案也可以发挥作用,但我一直/正在专门寻找能够满足所有这些要求的解决方案。

最佳答案

您的代码将使用相同的 keystore (从类加载器加载)作为默认 keystore 和默认信任库。这实际上等同于将 -Djavax.net.ssl.keystore*-Djavax.net.ssl.truststore* 设置为相同的值。

如果这是你想做的,那很好。 (不过,您可能希望在加载 keystore 后关闭 InputStream。)

这将影响整个 JVM,以及使用 SSLContext.getDefault() 的一切,特别是依赖于默认 SSLSocketFactory 的一切(URLConnection等等)。

由于这将是您的默认信任库,来自主要 CA 的默认受信任 CA 证书不会在您的信任库中,除非您还明确地将它们导入到您从类加载器加载的副本中。

据推测,您不会信任大量新的 CA(或自签名)证书。将 keystore 和信任库分开可能更方便,因为您的信任库可能对大多数客户端都是通用的,并且通常只是一开始的一次性配置步骤。

关于java - 在运行时从资源设置默认的 Java SSLContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8764845/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com