最近项目需要适配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打包证书库(设置密码更安全),注意一定要把整个证书链都依次加入信任证书库。



更多相关文章

  1. keytool 生成 Android(安卓)SSL 使用的 BKS
  2. Android数字签名的学习
  3. Android日常开发(24)[ERROR:ssl_client_socket_impl.cc(946)] hand
  4. android 开发生成csr,并把私钥和ca认证的crt合并成p12
  5. android httpclient https 单向连接tomcat
  6. 签名详解(一)
  7. Android(安卓)Studio 签名证书文件在build.gradle(app)中配置
  8. android证书指纹的生成
  9. 微信浏览器中直接下载ios、android的APP

随机推荐

  1. Pycharm 查看代码引用时,想跳回到上一步
  2. dubbo的spi机制分析和实战案例
  3. 【Rust日报】2020-09-19 Rust 2021: 降低
  4. 负载均衡概念入门
  5. 【Rust日报】2020-09-20 Rust 和 Node.js
  6. 【Rust日报】2020-09-21 Rust宣布成立错
  7. 面试官:你分析过线程池源码吗?
  8. 面试官:你分析过mybatis工作原理吗?
  9. Java岗 面试考点精讲(网络篇03期)
  10. Java岗 面试考点精讲(基础篇01期)