忽略SSL证书在Servlet

问题描述:

我得到以下异常:忽略SSL证书在Servlet

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target 

我做了一些研究,并改变了我的连接代码如下:

SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { 
      public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { 
       return true; 
      } 
     }).build(); 

CloseableHttpClient client = HttpClients.custom() 
      .setRedirectStrategy(new LaxRedirectStrategy()) 
      .setSslcontext(sslContext) 
      .setConnectionManager(connMgr) 
      .build(); 

这个固定的问题,到目前为止,我不再获得例外和连接的工作。

当我在Tomcat中运行的Servlet中使用相同的代码时,问题再次出现。

为什么?

请尝试下面的代码。

import java.security.cert.CertificateException; 
import java.security.cert.X509Certificate; 

import javax.net.ssl.X509TrustManager; 

public class DummyX509TrustManager implements X509TrustManager { 

    @Override 
    public X509Certificate[] getAcceptedIssuers() { 
     return null; 
    } 

    @Override 
    public void checkServerTrusted(X509Certificate[] paramArrayOfX509Certificate, String paramString) 
      throws CertificateException { 
    } 

    @Override 
    public void checkClientTrusted(X509Certificate[] paramArrayOfX509Certificate, String paramString) 
      throws CertificateException { 
    } 
}; 


final TrustManager[] trustAllCerts = new TrustManager[] { new DummyX509TrustManager() }; 
try { 
    SSLContext sslContext= SSLContext.getInstance("SSL"); 
    sslContext.init(null, trustAllCerts, null); 

    CloseableHttpClient client = HttpClients.custom() 
     .setRedirectStrategy(new LaxRedirectStrategy()) 
     .setSslcontext(sslContext) 
     .setConnectionManager(connMgr) 
     .build(); 
} catch (KeyManagementException e) { 
    throw new IOException(e.getMessage()); 
} catch (NoSuchAlgorithmException e) { 
    throw new IOException(e.getMessage()); 
} 
+0

我想这是为了解决CertificateException,它出现在我添加密钥库并导入.crt时出现。原来我无法真正使用这种解决方法,我宁愿避免最初的SunCertPathBuilderException。 – Tim

+0

不过我试过你的解决方案,现在我得到这个错误:java.security.KeyStoreException:访问信任的问题storejava.security.cert.CertificateParsingException:签名溢出,字节数= 266 at com.sun.net.ssl.internal。 ssl.TrustManagerFactoryImpl.engineInit(TrustManagerFactoryImpl.java:55)' – Tim

+1

您的回复让我检查了整件事情,并且在代码中出现错误。既然你是唯一回信的人,那你得到赏金是公平的:)谢谢 – Tim

是私人/公司拥有的CA签发的网站证书还是自签名的?

... new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() ... 
  • Trustore为空:
    你尝试加载包含信任的CA +锁链一个密钥/文件?
  • isTrusted总是返回“true”:
    您正在重写标准JSSE证书验证过程并信任所有,因此根本没有任何安全性。
  • 该例外:表示证书验证失败。 RootCA或整个CA链缺失。

所以看起来像Tomcat忽略了你的SSLContext。像那样使用,sslContext无用。调试结果? JVM SSL设置?异常堆栈跟踪?

您已经开发了一个servlet。对?它不过是一个网页。如果您希望启用SSL网页,则必须在安装该证书后购买SSL证书。如果您没有该证书,请使用上述代码。上述代码适用于所有安全问题。

您必须从Verisign和Thawte等公司购买SSL/TSL证书。