序
写这篇文章的开头是因为一个同事问了我一个问题,
他说如果iOS证书过期了,我们debug包就打不开了,那么appstore下载的包会怎么样呢?
关于证书的概念好像只有:从钥匙串生成CSR文件、上传到apple开发者中心、然后下一步、下一步、select...然后直接生成下载,过期了就重新配一下,感觉都知道又好像只知道这样的一个过程,直到翻了翻资料(李明杰底层原理(上)),才把证书、描述文件、签名...这些彻底弄明白了,如果你和我一样,只知道一个配置,那建议还是看一看这篇文章。
来源:底层原理(上)
学习路线
加密解密 -> 单项散列函数 -> 数字签名 -> 证书 -> iOS签名机制
一、关于加密
根据密码的类型分类:对称加密、非对称加密
- 对称加密:加密、解密使用相同的密钥
- 非对称加密:加密、解密使用不同的密钥(公钥、私钥),也被称为公钥加密
- 对称加密优缺点
优点:加密、解密速度快
缺点:不能很好地解决密钥配送问题
- 非对称加密特点、优缺点
特点
- 加密密钥:一般是公开的,因此该密钥称为公钥
- 解密密钥:由消息接收者自己保管,不能公开,因此称为私钥
- 公钥、私钥是一一对应的,不能单独生成
优点:能解决密钥配送问题
缺点:加密、解密速度慢
密钥配送
- 由消息的接受者,生成一对公钥、私钥
- 将公钥发给消息的发送者
- 消息的发送者使用公钥加密消息
- 混合加密
- 将 ‘对称加密’ 和 ‘非对称加密’ 的优势相结合
优点
- 解决了 ‘非对称加密’ 速度慢的问题
- 通过 ‘非对称加密’ 解决了 ‘对称加密’ 的密钥配送问题
说白了就是
- 用 ‘对称加密’ 对传输数据进行加密;
- 用 ‘非对称加密’ 对 ‘对称加密’ 的密钥进行加密。
二、单向散列函数
单向散列函数,又被称为消息摘要函数(message digest function),哈希函数
- 特点及作用
特点
- 根据任意长度的消息,计算出固定长度的散列值
- 计算速度快
- 消息不同,散列值也不同
- 具备单向性
作用:防止数据被篡改✨✨✨✨✨
说白了,就是不管对多长的内容进行计算,都能得到相同位数的一串数字,例:
MD5 ("123") = 202cb962ac59075b964b07152d234b70
MD5 ("123456789012345678901234567890") = a46857f0ecc21f0a06ea434b94d9cf1d
tips:可直接在Mac终端查看,使用该命令。
- md5 -s "xxxx"
- 常见的几种单向散列函数
MD5、SHA-1、SHA-2、SHA-3等
三、数字签名(注意:这里与数字证书区别对待)
- 消息发送者产生,别人无法伪造的一段数字串;(用私钥加密消息的散列值,生成的结果)
- 同时也是对信息的发送者发送信息真实性的一个有效证明
如何能保证这个签名是消息发送者自己签的?
- 用消息发送者的私钥进行签名
如果有人篡改了文件内容或者签名内容,会是什么结果?
- 签名验证失败,证明内容会篡改
数字签名不能保证机密性?
- 数字签名的作用不是为了保证机密性,仅仅是为了能够识别内容有没有被篡改
数字签名的作用
- 确认消息的完整性
- 识别消息是否被篡改
- 防止消息发送人否认
数字签名无法解决的问题:中间人攻击,如果遭遇了中间人攻击,那么
- 公钥将是伪造的
- 数字签名将失效
四、证书
利用CA的私钥,对其他人的公钥生成数字签名
作用:解决中间人攻击(避免公钥被拦截)✨✨✨
- 密码学中的证书,全称叫公钥证书(Public-key Certificate,PKC),跟驾驶证类似
- 里面有姓名、邮箱等个人信息,以及此人的公钥✨✨✨
- 并由认证机构(Certificate Authority,CA)施加数字签名✨✨✨
证书主要内容:个人信息、公钥、权威机构的数字签名
用自己的话说:
就是CA用自己的私钥对你的公钥进行认证,其他人用CA的公钥签名的合法性
五、iOS签名机制
作用:保证安装到手机上的App都是经过Apple官方允许的
苹果充当了CA机构
不管是真机调试,还是发布APP,开发者都需要经过一系列复杂的步骤
- 生成CertificateSigningRequest.certSigningRequest文件
- 获得ios_development.cer\ios_distribution.cer证书文件
- 注册device、添加App ID
- 获得*.mobileprovision文件
对于真机调试,现在的Xcode已经自动帮开发者做了以上操作
思考
每一步的作用是什么?
.certSigningRequest、.cer、.mobileprovision文件究竟里面包含了什么?有何用处?
- 如果从AppStroe下载的,里面没有mobileprovision文件,只有 I 和 VII
解释
1、Mac设备的公钥
- 从钥匙串生成CSR文件,就是生成公钥的过程
2、生成证书
- 把公钥(CSR文件)上传到Apple后台
- 利用Apple后台的私钥,对Mac设备的公钥进行签名后的证书文件
3、mobileprovision描述文件生成
- 选择app id
- 选择devices
六、重签名
- 查看codesign用法
man codesign
- 重签名步骤
1、准备一个embedded.mobileprovision文件(必须是付费产生的,aphid、device一定要匹配),并放入app中
- 可以通过Xcode自动生成,然后在编译后的App包中找到
- 可以去开发者证书网站下载
2、从embedded.mobileprovision文件中提取出embedded.plist权限文件
- security cms -D -I embedded.mobileprovision > temp.plist
- /usr/libexec/PlistBuddy -x -c 'Print :Entitlement' temp.plist > embedded.plist
3、查看可用的证书(可以看到证书ID)
- security find-identity -v -p codesigning
4、对.app内部的动态库、AppExtension进行签名
- codesign -fs 证书ID xxx.dylib
5、对.app包进行签名
- codesign -fs 证书ID --entitlements entitlements.plist xxx.app
- 过程
1、当前app的devices中不包含设备b
2、重新生成一个embedded.mobileprovision,包含设备b,
3、用步骤二中的embedded.mobileprovision替换步骤一种的embedded.mobileprovision
5、将文件夹压缩,修改类型为.ipa类型