web-dev-qa-db-ja.com

サーブレットでSSL証明書を無視する

次の例外が発生します。

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で実行されているサーブレットで同じコードを使用すると、問題が再び発生します。

どうして ?

15
Tim

次のコードを試してください。

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());
}
4
shazin

Webサイト証明書は、個人/会社所有のCAによって発行されたものですか、それとも自己署名ですか?

... new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() ...
  • Trustoreはnullです:
    信頼できるCAとそのチェーンを含むキーストア/ファイルを読み込もうとしましたか?
  • isTrustedは常に「true」を返します。
    標準のJSSE証明書検証プロセスをオーバーライドし、すべてを信頼しているため、セキュリティはまったくありません。
  • その例外:証明書の検証が失敗したことを意味します。 RootCA、またはCAチェーン全体が欠落しています。

したがって、Tomcatはあなたの SSLContext を無視したようです。そのように使用すると、sslContextはとにかく役に立たない。結果をデバッグしますか? JVM SSL設定?例外スタックトレース?

2
Seb B.