前言:
一天工作中,boss丢过来一个p12文件让做https的双向认证,搞得我一脸蒙逼!没办法一顿百度查看各路博客文档,才发现根本没有直接使用p12格式的文件的文档!又厚着脸皮去问了一下boss,才知道给我的就只有一个权威机构颁发的证书再2次签名生成的自建根证书(p12),而android文档给出的几乎都是需要2个证书的(bks和客户端证书)偶尔也能见到只用了一个证书的文档(bks)但这个和p12的也不对啊,想想可能需要转换格式!又是一顿百度查看openssl的转换命令!结果是好的转换成功了,照着文档就是一顿撸,悲剧的是代码运行起来一直报错Handshake failed握手失败!这个时候boss的声音又在后面响起来了,服务器没有配置客户端验证证书,需要客户端忽略服务器证书验证这一步!当时我只有一句MMP,前前后后又折腾了4/5天,始终不行(后来才知道自建证书android要用X509TrustManager来自定义,系统默认的TrustAllCerts 证书管理器不行)!我老是觉得服务器配置是不是不对的,或者证书哪里有问题,但是浏览器又确实是可以通过验证的一直没有找到解决方法(浏览器只需要一个p12文件验证过程都是自动实现的)!没办法和boss协商无效,最后丢给我一句!如果确实觉得有问题的话就只能你自己搭一个,因为我boss也不是专业的后台,而找不到原因的情况下,我也就只能自己去搭建一个了(MMP,我是一个android)迫于房贷的压力只能选择向恶势力低头了(也想了哈我媳妇儿),又是3/4天的时间各种了解服务器配置(最后选的相对最简单的phpStudy)查看证书生成(openssl),期间可能没有安装专业的openssl工具或者环境配置的原因,证书生成后各种出错(我使用的是phpStudy自带的openssl)这里也可能是因为各个文档的证书生成不同类型的证书命令有不小的区别,导致有的证书生成了没有报错但是会抛警告这个其实出来后证书也是失效的(注意查看命令后的结果)!证书的问题各种折腾后总算是弄出来了,就看服务器配置了,百度看了下Apache的文档只有寥寥几篇而nginx相对会更多更详细一些所以我也当然就把phpStudy的服务器切换到了nginx上面来实现!这里还有一个问题就是因为我们本地电脑配置的服务器,在手机上是访问不到的,哪怕是同在一个局域网上(这个问题我只能是请教后台的大佬,帮忙配置了dns来解决的)刚开始配置完成测试的时候还是会报Trust anchor for certification path not found信任锚点没有找到,四处查看源码和百度才艰难的发现需要使用X509TrustManager来自定义证书管理器!这样这个功能前后耗了我小半个月的时间,国内https应用的还不够多,很多文档也不详细,所以做个记录总结一下,本人也是小渣渣一枚,尽可能的备注详细了(大佬无视)!
各类知识点整理:
- 单双向验证基础知识点: https://www.jianshu.com/p/ea5f4b1d9c00
- phpstudy搭建本地服务器: https://www.jianshu.com/p/bbf853fc28f3
- 浏览器获取证书文件(p12转cer):https://www.jianshu.com/p/7f74acab6c74
- https双向认证证书生成:https://www.jianshu.com/p/094c7fc8cb85
- android okhttps双向验证(代码实现):https://www.jianshu.com/p/6229d10d3550
- android webView的双向验证:https://www.jianshu.com/p/e98119d04fd9
- 配置完成后的测试:https://www.jianshu.com/p/cfcf708a591a
- Glide okhttps证书验证全局配置:https://www.jianshu.com/p/ac0b5c5f3ca7
工具类:
- P12证书转BKS证书:https://www.jianshu.com/p/2a96c36b27fe
- 服务器网址检测(兼容性及协议检测):https://www.ssllabs.com/index.html