java - 默认 SSL 上下文初始化失败 : null

标签 java ssl

当创建 SSL 服务器时,我得到了这个异常:Default SSL context init failed: null。它似乎来自它无法找到 keystore 和信任库的事实。我尝试从 jar 文件中设置它们。文件存在于jar中,但似乎找不到资源。

String keystore = TestFramework.class.getResource("/security/keystore.jks").getFile();
System.setProperty("javax.net.ssl.keyStore", keystore);
System.setProperty("javax.net.ssl.keyStorePassword", password);
String truststore = TestFramework.class.getResource("/security/truststore").getFile();
System.setProperty("javax.net.ssl.trustStore", truststore);
System.setProperty("javax.net.ssl.trustStorePassword", "ebxmlrr");

我运行了 ls 命令来检查文件是否存在。它存在。然后我通过运行命令 jar -tf myjar.jar | 检查 keystore.jks 是否存在。 grep security 它存在。

security/
security/keystore.jks
security/truststore

我的应用程序在 Tomcat 下运行。

最佳答案

不起作用的原因是那些系统属性需要实际文件系统上的文件,而不是来自存档中的文件。你最好创建自己的 SSLContext使用那些 keystore 和 trustore 流:

KeyStore keyStore = KeyStore.getInstance("jks");
keyStore.load(TestFramework.class.getResourceAsStream("/security/keystore.jks"), password.toCharArray());
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance("SunX509");
keyManagerFactory.init(keyStore, password.toCharArray());

KeyStore trustStore = KeyStore.getInstance("jks");
trustStore.load(TestFramework.class.getResourceAsStream("/security/truststore"), "ebxmlrr".toCharArray());
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance("SunX509");
trustManagerFactory.init(trustStore);

SSLContext context = SSLContext.getInstance("SSL");
context.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), new SecureRandom());

...

HttpsURLConnection urlConnection = (HttpsURLConnection) url.openConnection();
urlConnection.setSSLSocketFactory(context.getSocketFactory());

关于java - 默认 SSL 上下文初始化失败 : null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3927733/

相关文章:

ssl - 如何在 Gunicorn 中禁用 SSLv3.0 并使用 TLS1.0

java - 你能在不同的线程上调用相同的方法吗?

java - 如何更新由 openFileOutput 创建的文件

java - JNI 将字符串从 C 传递到 java

node.js - 如何启用基于 NodeJS (Express) 的服务器的 SSL 连接

java - 读取 PEM 证书链中的数据

image - wordpress 是否应该通过 https 自动加载图像?

ssl - 嵌入式 Jetty 9 中基于 SSL 的 WebSocket

java - 返回 JAX-RS 响应时如何更改 POJO 属性名称?

java - 使用 DataFrameReader 从 S3 读取文件