BLOGTIMES
2017/10/01

Java の HttpsURLConnection で証明書検証を無効にする

  java  ssl 
このエントリーをはてなブックマークに追加

Java には HttpsURLConnection というクラスが用意されているので、これを使うと簡単に WebAPI を叩くクライアントが開発できます。
ところが、このクラスはきちんと接続先のサーバの SSL 証明書の検証を行うようになっているので、開発用にオレオレ証明書を使っていたりすると以下のようなエラーが出ることがあります。

Exception in thread "main" 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

これを回避するためには、きちんと証明書ストアをつくってそこに証明書を登録する方法もありますが、今回は開発用に検証を無効化してみました。
当たり前のことですが、これを使うとサーバの証明書がどのようなものでも HTTPS 通信が確立してしまうというセキュリティ上の問題が生じますので開発用途以外での利用はオススメできません。

ちなみに HttpsURLConnection の SSL の検証の仕様については「JSSEリファレンス・ガイド」で解説されています。今回はホスト名を検証する HostnameVerifier、鍵を管理する KeyManager、証明書を信頼するかどうかを管理する TrustManager の3つを無効化しています。

具体的なサンプルは以下から。

Java の HttpsURLConnection で証明書検証を無効にするサンプル

プロジェクトは hsur/DisableSSLCertificateChecking にアップロードしてあります。
disableSSLCertificateChecking() の部分がキモで、この部分をコメントアウトすると、エラーが出るようになる様子を確認できるはずです。

App.java


    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/9662
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン