Java による SSL 検証の無効化

MD Aminul Islam 2023年10月12日
Java による SSL 検証の無効化

URL に接続しようとすると、SSLHandshakeException または IOException エラーが発生することがあります。 このエラーの原因は、SSL 暗号化 接続の確立に失敗したことです。

Java では、SSL 接続を開こうとすると、SSL プロトコルの JSSE 実装が検証プロセスを実行して、要求されたホストが本物か偽物かをチェックします。 このチェックには、サーバーの X.509 証明書 の検証が含まれます。

この記事では、HTTP 接続を作成するときに、この証明書の検証を無効にする方法を示します。 また、トピックに関する説明を含むサンプルコードを記述して、理解を容易にします。

Java 無効化 SSL 検証

解決策に進む前に、URL に接続しようとしたときに表示される以下のエラーを見てみましょう。

Caused by: 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
    at sun.security.ssl.Alerts.getSSLException(Alerts.java:110)
    at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:149)
    at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:202)

上記の例外は、SSLHost VerificationCertificate Validation をオフにすることで回避できます。 それを達成するには、以下の例に従うことができます。

解決策: Host VerificationCertificate Validation をオフにする

以下の例では、Host VerificationCertificate Validation をオフにする方法を示しています。 次のコードを参照してください。

コード例:

// importing necessary packages
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.net.URLConnection;
import java.security.SecureRandom;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

// Our main class
public class DisableSSL {
  public static void main(String[] args) throws Exception {
    // Creating a Trust Manager.
    TrustManager[] TrustMgr = new TrustManager[] {
        new X509TrustManager(){public X509Certificate[] getAcceptedIssuers(){return null;
  }

  // No Checking required
  public void checkClientTrusted(X509Certificate[] certs, String authType) {}

  // No Checking required
  public void checkServerTrusted(X509Certificate[] certs, String authType) {}
}
}
;

// Installing the Trast manager
SSLContext SSLCont = SSLContext.getInstance("SSL");
SSLCont.init(null, TrustMgr, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(SSLCont.getSocketFactory());

// Creating an all-trusting verifier for Host Name
HostnameVerifier ValidHost = new HostnameVerifier() {
  public boolean verify(String HostName, SSLSession MySession) {
    return true;
  }
};

// Installing an all-trusting verifier for the HOST
HttpsURLConnection.setDefaultHostnameVerifier(ValidHost);
URL MyURL = new URL("https://www.example.com/"); // The location URL
URLConnection connect = MyURL.openConnection(); // Openning the URL connection
Reader MyReader = new InputStreamReader(connect.getInputStream()); // Creating a reader

while (true) { // Processing the reader data
  int Chars = MyReader.read();
  if (Chars == -1) {
    break;
  }
  System.out.print((char) Chars);
}
}
}

各行の目的については、すでに comments で説明しています。 しかし、コードを詳しく見てみると、checkClientTrustedcheckServerTrusted に対して何も定義していないことがわかります。

このようにして、検証をバイパスします。 したがって、上記のサンプル コードを実行すると、コンソールに次のような出力が表示されます。

<!doctype html>
<html>
<head>
    <title>Example Domain</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
    body {
        background-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;

    }
    div {
        width: 600px;
        margin: 5em auto;
        padding: 2em;
        background-color: #fdfdff;
        border-radius: 0.5em;
        box-shadow: 2px 3px 7px 2px rgba(0,0,0,0.02);
    }
    a:link, a:visited {
        color: #38488f;
        text-decoration: none;
    }
    @media (max-width: 700px) {
        div {
            margin: 0 auto;
            width: auto;
        }
    }
    </style>
</head>

<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is for use in illustrative examples in documents. You may use this
    domain in literature without prior coordination or asking for permission.</p>
    <p><a href="https://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>
著者: MD Aminul Islam
MD Aminul Islam avatar MD Aminul Islam avatar

Aminul Is an Expert Technical Writer and Full-Stack Developer. He has hands-on working experience on numerous Developer Platforms and SAAS startups. He is highly skilled in numerous Programming languages and Frameworks. He can write professional technical articles like Reviews, Programming, Documentation, SOP, User manual, Whitepaper, etc.

LinkedIn

関連記事 - Java SSL