![5ca801a3a3677efa137007f2d9fb795d.png](https://img-blog.csdnimg.cn/img_convert/5ca801a3a3677efa137007f2d9fb795d.png)
前言
本方案不会导致证书更换时候APP停服。
因为:
- APP不做证书完整校验。只做公钥校验;
- 服务器续费证书时候,不更换私钥,所以公钥不变动;客户端可以继续认可新版证书。
本方案的收益:
- 证书可以续费,可以和WEB端业务走同一个域名。
- APP一旦走了抓包(HTTPS的抓包),将会产生一个临时证书,与内置的公钥摘要不匹配,将会直接报错。很大程度上保证了APP的API请求不被截获篡改。再结合一些混淆服务,让dex文件不可读,API业务对接不做任何验签加密即可用于生产,减少研发投入。
在前面 为什么不推荐APP使用SSL-PINNING? 这篇文章,笔者提到了APP的证书校验的几种方式:
- 不校验
- 系统信任证书校验
- 公钥校验 ssl public key pinning
- 证书全内容校验 ssl certificate pinning
笔者推荐2和3两种。在我最近做的项目采取了第3种方案。
本篇和接下来的2篇文章将详解在真实生产项目中,我和同事对接详细流程和一些可复用的经验。
准备工作
1. SSL服务器证书。如果还没有采购证书,申请即可。我推荐let's encrypt证书(90天一续期)。申请方式见 https://imququ.com/post/letsencrypt-certificate.html
流程
1. 提取证书的公钥
openssl rsa -in certificate.crt -pubout > public_key.pub
2. 将 public_key.pub
内的 ---begin public key---
和 ---end public key---
去除,并合并成一行
cat public_key.pub | grep -v 'PUBLIC' | awk '{printf("%s",$0)}'
得到的输出类似
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMI...
3. 利用2命令输出的结果,然后 计算sha256摘要 (下载pubkey-sha256.py)
python pubkey-sha256.py MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMI...
得到的输出类似
SHA256:S8Ff3JCaO4V...
将开头的 SHA256:
改成 sha256/
,得到
sha256/S8Ff3JCaO4V...
将此字符串给到安卓和iOS端,并按照后续文章进行编码:
后续
1. APP优雅进行SSL证书校验——(二)安卓篇
2. APP优雅进行SSL证书校验——(三)iOS篇 [文章未完成]
参考及引用
1. 如何正確設定 AFNetworking 的安全連線 « Nelson 寫些 iOS 開發的東東
2. https://gist.github.com/StevenMaude/f054064ede8c9e781ed8
3. CertificatePinner (OkHttp 3.10.0 API)