繁体   English   中英

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

[英]Setting the default Java SSLContext from a resource at runtime

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

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

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

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

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

如果你想做的话,这很好。 (但是,您可能希望在加载密钥库后关闭InputStream 。)

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM