在运行时从资源设置默认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
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);
现在,我意识到其他解决方案也可以使用,但我一直在/正在特别寻找一种能够满足所有这些要求的解决方案。您的代码将使用与默认密钥存储和默认信任存储相同的密钥存储(从类加载器加载)。这实际上相当于使用相同的值设置
-Djavax.net.ssl.keystore*
和-Djavax.net.ssl.truststore*
如果这是你想做的,这很好。(不过,加载密钥库后,您可能需要关闭InputStream
。)
这将影响整个JVM,以及使用SSLContext.getDefault()
的所有内容,尤其是依赖默认SSLSocketFactory
的所有内容(URLConnection
等等)
因为这将是您的默认信任存储,所以来自主要CA的默认受信任CA证书不会在您的信任存储中,除非您还将它们显式导入到从类加载器加载的副本中
据推测,您不会有大量新的CA(或自签名)证书可信任。将密钥存储库和信任存储库分开可能更方便,因为您的信任存储库可能对大多数客户机都是通用的,并且通常在开始时只是一次性的配置步骤