Android Nougat(7.0)以上のChain validation failedソリューション


最近のプロジェクトは7.0を適当に配合する必要があります.
Caused by: java.security.cert.CertificateException: Chain validation failed
ネットワークセキュリティ構成はtargetSdk>23のアプリケーションにのみ適用されますが、それでも試してみましたが、結果は変わりません.
Googleで解決策が見つからないままopenssl分析を開始しました.
openssl s_client -connect 192.168.1.1:8443  -cert path/client.cer -key path/client-key.pem -tls1 -CAfile path/ca.cer

握手中にエラーが報告されたが、7.0以下の接続には影響しないことが分かった.7.0以降、SSL検証の一環が強化され、どのエラーも握手に失敗すると推測されている.
最後に-CAfileに必要なのはrootだけでなく証明書チェーンであることが分かった.cerは、すべての証明書情報を含む必要があります.
-----BEGIN CERTIFICATE----- 
( : domain.cer) 
-----END CERTIFICATE----- 
-----BEGIN CERTIFICATE----- 
( : domain1.cer)
-----END CERTIFICATE----- 
..........................
..........................
-----BEGIN CERTIFICATE----- 
( :root.cer) 
-----END CERTIFICATE-----

同様に、Androidは信頼証明書ライブラリの生成後に以下のコードを追加する必要があると推定されています.
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream caInput =IApplication.getContext()
                        .getResources().openRawResource(R.raw.ca_c);
Certificate ca_c;
try {
ca_c = cf.generateCertificate(caInput);
} finally {
caInput.close();
}
//            ,             
if(ca_c!=null){
trustStore.setCertificateEntry("ca", ca_c);
}

ps:もちろんBCを使用して証明書ライブラリをパッケージ化することもできます(パスワードを設定したほうが安全です)、証明書チェーン全体を信頼証明書ライブラリに順次追加することに注意してください.