代码之家  ›  专栏  ›  技术社区  ›  Sydney

默认SSL上下文初始化失败:空

  •  1
  • Sydney  · 技术社区  · 14 年前

    创建SSL服务器时,出现了以下异常: Default SSL context init failed: null . 似乎是因为找不到密钥库和信任库。我试着从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 命令检查文件是否存在。它存在。然后我通过运行命令检查keystore.jks是否存在 jar -tf myjar.jar | grep security 它存在。

    security/
    security/keystore.jks
    security/truststore
    

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

    1 回复  |  直到 14 年前
        1
  •  6
  •   laz    14 年前

    不起作用的原因是这些系统属性期望实际文件系统上有一个文件,而不是来自归档文件中。你最好创造自己的 SSLContext 使用这些密钥库和信任流:

    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());