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

前端之家收集整理的这篇文章主要介绍了如何在java SSL客户端应用程序中支持多个TrustStore前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我们的 java应用程序中,我们需要使用https协议与SSL上的服务器列表进行通信.要通信的服务器列表将在运行时更改.最初我们没有任何服务器的证书.在运行时,我们将获得新服务器的证书并将公钥证书添加到信任库中;与服务器的任何新https连接都应使用更新的信任库.

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

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

谢谢,
迪帕克

解决方法

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

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

这将遵循这些方针:

  1. PKIXSSLContextFactory sslContextFactory = new PKIXSSLContextFactory();
  2. sslContextFactory.setTrustManagerWrapper(new X509TrustManagerWrapper() {
  3. @Override
  4. public X509TrustManager wrapTrustManager(final X509TrustManager origManager) {
  5. return new X509TrustManager() {
  6. @Override
  7. public X509Certificate[] getAcceptedIssuers() {
  8. return origManager.getAcceptedIssuers();
  9. }
  10.  
  11. @Override
  12. public void checkServerTrusted(X509Certificate[] chain,String authType)
  13. throws CertificateException {
  14. try {
  15. // This will call the default trust manager
  16. // which will throw an exception if it doesn't know the certificate
  17. origManager.checkServerTrusted(chain,authType);
  18. } catch (CertificateException e) {
  19. // If it throws an exception,check what this exception is
  20. // the server certificate is in chain[0],you could
  21. // implement a callback to the user to accept/refuse
  22. }
  23. }
  24.  
  25. @Override
  26. public void checkClientTrusted(X509Certificate[] chain,String authType)
  27. throws CertificateException {
  28. origManager.checkClientTrusted(chain,authType);
  29. }
  30. };
  31. }
  32. });
  33. SSLContext sslContext = sslContextFactory.buildSSLContext();

((PKIX)SSLContextFactory和X509TrustManagerWrapper来自jSSLutils,但其余部分来自J2SE / J2EE.)

您可能想要捕获一些CertificateExceptions(请参阅子类).
如果您对用户进行回调,则SSL / TLS连接可能会因SSL / TLS握手超时而失败(如果回调时间太长而无法回复).

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

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

猜你在找的Java相关文章