java - 我是否应该始终在我的 WebClient 中明确加载 keyStore 以获取授权服务?

标签 java ssl keystore

我有一个 java keystore ,可以通过它连接到 protected https 第三方服务。当我初始化我的网络客户端时,我在我的代码中明确地使用了这个 keystore :

// Solution #1
String password = "changeit";
KeyStore keyStore = KeyStore.getInstance(new File("src/main/resources/keystore.jks"), password.toCharArray());

SSLContext sslContext = new SSLContextBuilder()
    .loadKeyMaterial(keyStore, password.toCharArray())
    .build();

SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(sslContext, (hostname, session) -> true);

HttpClient httpClient = HttpClients.custom()
    .setSSLSocketFactory(socketFactory)
    .build();
使用这种方法,一切正常。
但我也知道可以指定系统变量javax.net.ssl.keyStorejavax.net.ssl.keyStorePassword .所以我期待上面代码的替代解决方案也可以工作:
// Solution #2
System.setProperty( "javax.net.ssl.keyStore", "src/main/resources/keystore.jks");
System.setProperty( "javax.net.ssl.keyStorePassword", "changeit"); 
HttpClient httpClient = HttpClients.createDefault();
我创建了一个默认的 Web 客户端,而不用我的 keystore 显式地构造 SSLContext。我预计默认的 Web 客户端会以某种方式自动从 javax.net.ssl.keyStore 获取 keystore 。 .但它似乎没有采取,这个解决方案对我不起作用。
所以我想知道使用系统属性的目的是什么javax.net.ssl.keyStore ?它如何有用?这里的最佳做法是什么?

最佳答案

您可以执行类似于第一个解决方案的操作,但您必须将密码删除为 String ,密码应该在您的properties运行时加载的文件,或者在启动 JVM 时将其指定为环境变量。
我想说的重点是密码不应该在代码中。
对于第二种解决方案,您可能需要查看 trustStore环境变量。
https://docs.oracle.com/javadb/10.8.3.0/adminguide/cadminsslserver.html

关于java - 我是否应该始终在我的 WebClient 中明确加载 keyStore 以获取授权服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63719397/

相关文章:

java - 如果键是字符串数组,为什么 HashMap 无法识别它的键?

java - 最近有关 JVM 的书籍?

JAVA链表在第二个位置添加节点

ssl - 如何在 Window 7 中使用 TLS 配置 RDP

java - 构建证书颁发机构架构

java - 使用openCV模板匹配器,在没有所需对象的情况下,无论如何都能找到匹配项。如何获得异常(exception)?

ssl - SSL 证书如何影响网页排名?

security - 如何在特定域中提取有关 SSL 加密的信息

java - 在 Undertow 中启用 HTTPS

ssl - Jenkins 工作-DSL : How to accept URL over Https with own root-ca signed certificate?