iOS 签名到底是怎么回事?用大白话讲清楚
不扯那些密码学术语,用最通俗的方式讲明白 iOS 代码签名的原理和为什么会掉签。
7cert ·
先打个比方
你可以把代码签名理解成"封蜡"。古代写信怕被人偷看,信封上盖个火漆印章。收信人看到印章完好就知道信没被拆过,看到印章上的家徽就知道是谁寄的。iOS 签名干的就是这个事。
签名的时候发生了什么
你用签名工具把 P12 证书和描述文件喂进去,签名工具会:
- 用你 P12 里的私钥,对 App 里每个文件算一遍哈希(相当于"指纹"),然后对这些哈希签名
- 把签名结果写进
_CodeSignature目录 - 把描述文件塞进 App 包里
打包完成,一个签好名的 IPA 就出来了。
iOS 验证签名的过程
用户装 App 的时候(或者打开 App 的时候),iOS 会做一套检查:
- 这个描述文件是苹果签发的吗?→ 验苹果的签名
- 签名证书在描述文件的允许列表里吗?→ 对比证书
- 证书有没有被苹果吊销?→ 联网查 OCSP
- App 里的文件有没有被改过?→ 校验所有哈希值
- 这台设备允许装吗?→ 检查 UDID 或看是不是企业分发
任何一步没过,App 就打不开。
掉签的本质
搞清楚了上面的流程,掉签就好理解了。最常见的情况是苹果在 OCSP 服务器上把你的证书标记成了 revoked(已吊销),iOS 一查发现证书已经被吊销了,直接拒绝运行。
这也解释了为什么飞行模式有时候掉签的 App 还能打开——因为它联不了网查不了 OCSP。但这只是临时的,iOS 缓存过期后该查还是会查。
实用建议
了解原理不是为了炫技,是为了在出问题的时候知道往哪个方向排查。App 装不上了,先上 7cert 查证书状态;确认没被吊销的话再看描述文件有没有过期、UDID 注册了没有。有了排查思路,解决问题就快很多。
常见问题
不联网的话 App 会掉签吗?
短时间不会,iOS 有 OCSP 缓存。但缓存过期后联网就会重新查询,证书已经被吊销的话还是会掉。
自己做的证书能签名吗?
不能。iOS 只认苹果签发的证书链,自签名证书不在信任链里,验证直接失败。
签名能被破解或伪造吗?
理论上不能。苹果用的是非对称加密,没有私钥伪造不了签名。所以 P12 的私钥一定要保管好。