忽略 Servlet 中的 SSL 证书

Posted

技术标签:

【中文标题】忽略 Servlet 中的 SSL 证书【英文标题】:Ignore SSL Certificate in a Servlet 【发布时间】:2016-01-28 10:07:29 【问题描述】:

我收到以下异常:

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 中使用相同的代码时,问题再次出现。

为什么?

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

... new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() ...
Truststore 为空:您是否尝试加载包含受信任 CA 及其链的密钥库/文件? isTrusted 始终返回“true”:您正在覆盖标准 JSSE 证书验证过程并信任所有,因此根本没有安全性。 那个异常:表示证书验证失败。 RootCA,或整个 CA 链丢失。

所以 Tomcat 似乎忽略了您的 SSLContext。像这样使用,sslContext 无论如何都没用。调试结果? JVM SSL 设置?异常堆栈跟踪?

【讨论】:

【参考方案3】:

试试下面的代码。

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

【讨论】:

我想这是为了解决我添加密钥库并导入 .crt 时出现的 CertificateException。事实证明我不能真正使用这种解决方法,我宁愿避免最初的 SunCertPathBuilderException。 尽管如此,我尝试了您的解决方案,但现在出现此错误:java.security.KeyStoreException: problem accessing trust storejava.security.cert.CertificateParsingException: signed overrun, bytes = 266 at com.sun.net.ssl.internal.ssl.TrustManagerFactoryImpl.engineInit(TrustManagerFactoryImpl.java:55) 你的回复让我检查了整个事情,我的代码有错误。由于您是唯一回复的人,因此您获得赏金是公平的:) 谢谢

以上是关于忽略 Servlet 中的 SSL 证书的主要内容,如果未能解决你的问题,请参考以下文章

忽略 Apache HttpClient 4.3 中的 SSL 证书

如何忽略 Apache HttpComponents HttpClient 5.1 中的 SSL 证书错误

忽略 Xamarin.Forms (PCL) 中的 SSL 证书错误

如何忽略 Guzzle 5 中的无效 SSL 证书错误

RestSharp - 忽略 SSL 错误

如何使用 QWebEngineView 忽略 SSL 证书错误