【问题标题】:JAVA Use two keystore same applicationJAVA 使用两个 keystore 相同的应用程序
【发布时间】:2015-04-19 10:18:25
【问题描述】:

我正在尝试用 java 开发一个应用程序,它基本上从 REST-JSON API 获取大量数据并将其插入数据库。我的问题是我使用的两个 URL 引发了有关 SSL 证书的错误。为了解决这个问题,我创建了一个 jks 文件并插入了他们的证书。问题是,一旦我把它放在我的代码上,jvm 只使用该文件上的证书,所有其他的都被拒绝。所以我想让我的应用程序接受来自“cacerts.jks”和“custom.jks”的json。请不要告诉我将证书添加到“teste.jks”(来自 jvm),因为该应用程序无法在我的计算机上运行,​​我需要将证书保存在单独的文件中。

再观察一下,我正在使用大约 90 个不同的 URL,并且我使用以下行来指示 jvm,使用哪个密钥库:

System.setProperty("javax.net.ssl.trustStore",System.getProperty("user.dir")+"/libs/teste.jks");
    //or (for native one):
System.setProperty("javax.net.ssl.trustStore", "cacerts.jks");

【问题讨论】:

    标签: java ssl keystore jks


    【解决方案1】:

    实现 javax.net.ssl.TrustManager 的子类或其子类之一,如 javax.net.ssl.X509TrustManager(以下示例中的 MyTrustManager)并调整 SSLContext 以使用它。您的信任管理器实现可以在验证/信任证书方面做任何您想做的事情。

            SSLContext context = SSLContext.getInstance("TLS");
            MyTrustManager tm = new MyTrustManager();
            SecureRandom sr = SecureRandom.getInstance("SHA1PRNG", "SUN");
            context.init(null, new TrustManager[] { tm }, sr);
            SSLContext.setDefault(context);
            HttpsURLConnection.setDefaultSSLSocketFactory(context.getSocketFactory());
    

    【讨论】:

      【解决方案2】:

      创建两个 TrustManager,一个使用默认信任库,一个使用您自己的,并使用两者初始化 SSLContext:

      sslContext.init(null, new TrustManager[]{tm1, tm2}, null);
      

      有关详细信息,请参阅 JSSE 参考指南。

      【讨论】:

      • 您能帮我创建这些 TrustManager 吗?一个是默认的,另一个来自 jks 文件...
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-07
      • 1970-01-01
      相关资源
      最近更新 更多