【问题标题】:Setting the default Java SSLContext from a resource at runtime在运行时从资源设置默认 Java SSLContext
【发布时间】:2012-02-04 14:18:37
【问题描述】:

我的问题的基本组成部分是(上下文遵循代码 sn-p)

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

    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 客户端。由于各种原因,将客户端证书和密钥添加到默认密钥库并不是一个理想的选择。理想情况下,我正在寻找一种方法,将密钥库作为资源文件包含在 JAR 中,并在运行时根据需要将其设置为默认值。我还想避免在每个对象的基础上配置每个客户端和/或连接,并且还支持诸如 JaxWsDynamicClientFactory 之类的操作(主要是为了“完整性”)。

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

现在,我意识到其他解决方案也可以使用,但我当时/正在特别寻找能够满足所有这些要求的解决方案。

【问题讨论】:

    标签: java ssl jax-ws keystore


    【解决方案1】:

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

    如果这是您想要做的,这很好。 (不过,一旦您加载了密钥库,您可能想要关闭 InputStream。)

    这将影响整个 JVM,以及使用 SSLContext.getDefault() 的所有内容,尤其是依赖默认 SSLSocketFactoryURLConnection 等)的所有内容。

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

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

    【讨论】:

      猜你喜欢
      • 2018-01-16
      • 2018-09-13
      • 2010-10-07
      • 1970-01-01
      • 2016-12-08
      • 1970-01-01
      • 1970-01-01
      • 2013-11-15
      • 1970-01-01
      相关资源
      最近更新 更多