JAVA使用两个keystore相同的应用程序

时间:2015-04-19 01:55:49

标签: java ssl keystore jks

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

还有一个观察,我正在处理大约90个不同的网址,并且我使用以下行来表示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");

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

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