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を作成し、次の内容を記述します。
<?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で作成します。
また、証明書のファイル名は英数小文字とアンダーバー(_)しか使用できないようです。
参考