Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在运行时从资源设置默认Java SSLContext_Java_Ssl_Jax Ws_Keystore - Fatal编程技术网

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

在运行时从资源设置默认Java SSLContext,java,ssl,jax-ws,keystore,Java,Ssl,Jax Ws,Keystore,我的问题的基本组成部分是(上下文跟在代码片段后面) 以下代码是否是通过-Djavax.net.ssl.keystore设置默认Java密钥库的有效替代方案 除了更改默认密钥和信任管理器之外,此代码对受影响JVM中SSL的行为有什么影响 除了在运行时从资源中设置默认信任/密钥存储,还有更好的选择吗 KeyStore ks = KeyStore.getInstance("JKS"); ks.load(testService.class.getClassLoader().getResourceAsSt

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

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

    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之类的操作(主要是为了“完整性”)

    我在互联网上搜索相关资料,发现了这些(,)相关的问题,但没有一个解决方案是我想要的(尽管我确实将它们作为开发上述代码的跳板)


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

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

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

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

    因为这将是您的默认信任存储,所以来自主要CA的默认受信任CA证书不会在您的信任存储中,除非您还将它们显式导入到从类加载器加载的副本中

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