Android(安卓)Nougat(7.0) 及以上出现 Chain validation failed 的解决方案
16lz
2021-01-26
最近项目需要适配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打包证书库(设置密码更安全),注意一定要把整个证书链都依次加入信任证书库。
更多相关文章
- keytool 生成 Android(安卓)SSL 使用的 BKS
- Android数字签名的学习
- Android日常开发(24)[ERROR:ssl_client_socket_impl.cc(946)] hand
- android 开发生成csr,并把私钥和ca认证的crt合并成p12
- android httpclient https 单向连接tomcat
- 签名详解(一)
- Android(安卓)Studio 签名证书文件在build.gradle(app)中配置
- android证书指纹的生成
- 微信浏览器中直接下载ios、android的APP