Androidアプリでhttps通信した際にCertPathValidatorExceptionが発生する場合の解決方法

端末の信頼できる認証情報に証明書をインストールしているにも関わらず、AndroidアプリでHttpsURLConnectionを使いWebAPIにアクセスすると、次のような例外(java.security.cert.CertPathValidatorException)が発生しました。

実行コード(抜粋)
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
:
connection.connect();
例外
javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

この場合の対処方法です。

前提として証明書が必要です。自己証明書の作成については下記を参考にしてください。

OpenSSLを使って自己署名証明書を作成する
1. マニフェストファイルの編集

AndroidManifest.xmlを開き、applicationネットワーク セキュリティ構成機能のXML ファイルを指定します。

<manifest ...>
    <application
        :
        android:networkSecurityConfig="@xml/network_security_config"
        :
    >
    </application>
</manifest>
2. 信頼できるCAを追加する

res/xml/network_security_config.xmlを作成し、次の内容を記述します。

network_security_config.xml
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">domain-name</domain>
        <trust-anchors>
            <certificates src="@raw/local_ca_crt" />
        </trust-anchors>
    </domain-config>
</network-security-config>
  • domain-name - 実際のドメイン名を記述します
  • local_ca_crt - 実際の証明書ファイル名を記述します
3. リソースに証明書を含める

res/raw/に証明書ファイルを追加します。今回であればres/raw/local_ca_crt.cerとなります。
rawファルダが無い場合は、AndroidStudioでresを右クリック>New>Folder>Raw Resources Folderで作成します。
また、証明書のファイル名は英数小文字とアンダーバー(_)しか使用できないようです。

参考
このエントリーをはてなブックマークに追加
にほんブログ村 IT技術ブログへ

スポンサードリンク

関連コンテンツ

コメント

メールアドレスが公開されることはありません。 が付いている欄は必須項目です