当前位置:  开发笔记 > 编程语言 > 正文

如何在java SSL客户端应用程序中支持多个TrustStore

如何解决《如何在javaSSL客户端应用程序中支持多个TrustStore》经验,为你挑选了1个好方法。

在我们的java应用程序中,我们需要使用https协议与SSL上的服务器列表进行通信.要通信的服务器列表将在运行时更改.最初我们没有任何服务器的证书.在运行时,我们将获得新服务器的证书并将公钥证书添加到信任库中; 与服务器的任何新https连接都应使用更新的信任库.

我们认为我们应该使用两个信任库,一个cacerts(默认一个附带jre)和其他包含我们在列表中动态添加/删除的服务器的证书.这将确保我们不修改java的默认TrustStore(cacerts).

请建议如何实现这一目标.此外,有没有办法只为java中的特定线程使用特定的信任存储,以便其他(现有的和新的)线程仍应使用默认的java trueststore(cacerts),并且一个特定的线程将使用特定的信任库服务器.

谢谢,迪帕克



1> Bruno..:

如果要动态导入证书,可能需要使用自定义x509TrustManager.这是在配置时完成的SSLContext,它本身用于创建SSLSocketFactorySSLEngine.

jSSLutils是一个库,允许您包装现有的信任管理器并自定义某些设置.你不需要它,但它可能有所帮助.

这将遵循这些方针:

PKIXSSLContextFactory sslContextFactory = new PKIXSSLContextFactory();
sslContextFactory.setTrustManagerWrapper(new X509TrustManagerWrapper() {
    @Override
    public X509TrustManager wrapTrustManager(final X509TrustManager origManager) {
        return new X509TrustManager() { 
            @Override
            public X509Certificate[] getAcceptedIssuers() {
                return origManager.getAcceptedIssuers();
            }

            @Override
            public void checkServerTrusted(X509Certificate[] chain,
                                                   String authType)
                    throws CertificateException {
                try {
                    // This will call the default trust manager
                    // which will throw an exception if it doesn't know the certificate
                    origManager.checkServerTrusted(chain, authType);
                } catch (CertificateException e) {
                    // If it throws an exception, check what this exception is
                    // the server certificate is in chain[0], you could
                    // implement a callback to the user to accept/refuse
                }
            }

            @Override
            public void checkClientTrusted(X509Certificate[] chain,
                                                   String authType)
                    throws CertificateException {
                origManager.checkClientTrusted(chain, authType);
            }
        };
    }
});
SSLContext sslContext = sslContextFactory.buildSSLContext();

(中(PKIX)SSLContextFactoryX509TrustManagerWrapper来自jSSLutils,但其余的是可用的J2SE/J2EE).

有几个CertificateException小号,你可能想赶上(见子类).如果您对用户进行回调,则SSL/TLS连接可能会因SSL/TLS握手超时而失败(如果回调时间太长而无法回复).

然后你可以使用它SSLContext作为你的默认使用SSLContext.setSSLContext(...)(来自Java 6),但这不一定是个好主意.如果可以,请将SSLContext其传递给进行SSL/TLS连接的库.如何做到这一点各不相同,但Apache HTTP Client 4.x有多个选项来配置其SSL设置,其中一个是通过传递KeyStores,另一个是通过传递SSLContext.

您还可以通过检查当前线程中的每个线程而不是每个要连接的对象(依赖于库),X509TrustManager这可能会使同步和线程管理/"感知"方面的事情变得更复杂一些.信托经理.

推荐阅读
低调pasta_730
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有