忽略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());
}
答
是私人/公司拥有的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证书。
我想这是为了解决CertificateException,它出现在我添加密钥库并导入.crt时出现。原来我无法真正使用这种解决方法,我宁愿避免最初的SunCertPathBuilderException。 – Tim
不过我试过你的解决方案,现在我得到这个错误:java.security.KeyStoreException:访问信任的问题storejava.security.cert.CertificateParsingException:签名溢出,字节数= 266 at com.sun.net.ssl.internal。 ssl.TrustManagerFactoryImpl.engineInit(TrustManagerFactoryImpl.java:55)' – Tim
您的回复让我检查了整件事情,并且在代码中出现错误。既然你是唯一回信的人,那你得到赏金是公平的:)谢谢 – Tim