iOS 签名到底是怎么回事?用大白话讲清楚

不扯那些密码学术语,用最通俗的方式讲明白 iOS 代码签名的原理和为什么会掉签。

7cert ·

先打个比方

你可以把代码签名理解成"封蜡"。古代写信怕被人偷看,信封上盖个火漆印章。收信人看到印章完好就知道信没被拆过,看到印章上的家徽就知道是谁寄的。iOS 签名干的就是这个事。

签名的时候发生了什么

你用签名工具把 P12 证书和描述文件喂进去,签名工具会:

  1. 用你 P12 里的私钥,对 App 里每个文件算一遍哈希(相当于"指纹"),然后对这些哈希签名
  2. 把签名结果写进 _CodeSignature 目录
  3. 把描述文件塞进 App 包里

打包完成,一个签好名的 IPA 就出来了。

iOS 验证签名的过程

用户装 App 的时候(或者打开 App 的时候),iOS 会做一套检查:

  1. 这个描述文件是苹果签发的吗?→ 验苹果的签名
  2. 签名证书在描述文件的允许列表里吗?→ 对比证书
  3. 证书有没有被苹果吊销?→ 联网查 OCSP
  4. App 里的文件有没有被改过?→ 校验所有哈希值
  5. 这台设备允许装吗?→ 检查 UDID 或看是不是企业分发

任何一步没过,App 就打不开。

掉签的本质

搞清楚了上面的流程,掉签就好理解了。最常见的情况是苹果在 OCSP 服务器上把你的证书标记成了 revoked(已吊销),iOS 一查发现证书已经被吊销了,直接拒绝运行。

这也解释了为什么飞行模式有时候掉签的 App 还能打开——因为它联不了网查不了 OCSP。但这只是临时的,iOS 缓存过期后该查还是会查。

实用建议

了解原理不是为了炫技,是为了在出问题的时候知道往哪个方向排查。App 装不上了,先上 7cert 查证书状态;确认没被吊销的话再看描述文件有没有过期、UDID 注册了没有。有了排查思路,解决问题就快很多。

常见问题

不联网的话 App 会掉签吗?

短时间不会,iOS 有 OCSP 缓存。但缓存过期后联网就会重新查询,证书已经被吊销的话还是会掉。

自己做的证书能签名吗?

不能。iOS 只认苹果签发的证书链,自签名证书不在信任链里,验证直接失败。

签名能被破解或伪造吗?

理论上不能。苹果用的是非对称加密,没有私钥伪造不了签名。所以 P12 的私钥一定要保管好。

马上检测:上传 P12、描述文件(.mobileprovision)或 IPA 到 7cert,免费查看证书信息与吊销状态,文件检测完即销毁。

更多文章