IOS证书分析

来源:互联网 发布:sql 表字段添加注释 编辑:程序博客网 时间:2024/06/08 16:12

最近碰到IOS打包迁移开发环境的问题,整理了一下中间的一些细节和技术。

AppID & BundleID


当需要创建一个新的App的时候,会提示需要先创建AppID

  • Explicit App ID : 一个对应一个App
  • Wildcard App ID : 通配符AppID。根据格式可以匹配多个应用AppID

公钥私钥加密、数字签名


对称加密和非对称加密

苹果的证书中使用大量的非对称加密技术和数字签名技术。

对称加密 : 发送方和接收方使用同样的私钥,在发送时候使用使用公钥加密,接受的使用私钥进行解密
非对称加密 :发送发使用接收方的公钥加密,接收方使用自己的私钥解密

image_1bnqshprc189g1pq38sg1prv10m720.png-17.9kB

摘要算法、数字签名

摘要算法对数据进行计算,得出数据的识别码(摘要)。常见的MD5或者SHA算法都属于摘要算法的范围。算法得出来的值不可逆,而且几乎可以认为是数据的唯一识别码的(在极少数的情况下,不同数据会得出相同的摘要)。
数字签名是对数据进行摘要算法处理,然后用私钥对摘要进行加密。

image_1bnqsilrgb8b15071luj1neg1c9d2d.png-37.2kB

苹果打包流程


下边这个图是申请各个证书的流程

image_1bnqsc8nu1bef1fcq2jb1s132ilp.png-79.5kB

1) 在KeyChain中向CA申请证书

向苹果申请证书后,KeyChain中自动添加公钥私钥,同时生成.cerSigningRequest(csr)文件

.certSigningRequest
一段在SSL认证过程提交给CA的加密文本。一般情况下由认证服务器生成的,包含证书中的一些信息。诸如组织名,常用名(域名),地址,国家,邮箱地址等信息。
证书中的公钥也会包含在内。私钥在创建CSR的同时被创建。
CSR文件通常根据PKCS #10规范用ASN.1加密。CA会用CSR来创建你的SSL认证,但是它不会需要你的密钥。你需要自己保存你的密钥,这个CSR创建的认证只能和对应的密钥一起使用。所以如果你丢失了密钥,认证就会失效。

2) 生成.cer证书

上传.cerSigningRequestMC(Member Center)
开发者证书包括开发证书(Development Certificates)和发布证书(Production Certificates)
苹果的Push Notifications需要额外的SSL证书
.cer中包含证书中的信息,公钥,苹果公钥

3) 生成provisioning profile

image_1bnqsfkqc10hm1jh57161d8b1l3n16.png-38.7kB

Provisioning Profile中包含

  1. AppID
  2. 使用哪些证书
  3. 功能授权列表
  4. 可安装设备的UUID列表
  5. 苹果的签名。签名是苹果的,所以和我们的私钥没有关系。这意味着,这个文件只能从MC下载,我们不能随意修改。

4) xcode使用Provisioning Profile和私钥进行签名

这个过程中,xcode会使用Provisioning Profile
image_1bno5h1umni0ov61qm11mn1unn9.png-122.6kB

xcode有自动签名的功能。会使用我们的私钥对应用的所有文件framework进行签名。
然后再把他们压缩成ipa格式。就是我们最后的应用包啦。
根据证书的不同,可以发布到AppStore和Ad-hoc上。

5) 生成.p12文件

在团队开发的时候,我们只要在一台机器上设置好以上所有步骤。再导出.p12文件,导入到其他设备中,就可以轻松搭建环境啦。

.p12(在windows平台下为.pfx)相当于.cer + 私钥,同时包含公钥和私钥。在导出的时候需要额外的密码对数据进行额外的加密。

6) IOS验证APP安全

IOS系统内部嵌入了整套证书验证,在启动的时候大抵会验证一下这几步:

  1. 对embedded.mobileprovision进行验证。
    • 通过文件内的签名,使用苹果公钥验证mobileprovision文件本身有没有被修改
    • 验证AppID
    • 验证证书种类和证书,比如开发证书和发布证书
    • 验证设备ID
  2. 使用_CodeSignature/CodeResources对所有文件的签名,对所有文件进行验证

如果我们要对App进行重签名,就需要在MC上创建一个新的证书,provision文件。替换掉embedded.mobileprovision文件,用新的证书对所有文件进行签名,在对framework进行签名,最后再压缩ipa文件

推荐阅读


  • 漫谈iOS程序的证书和签名机制 - 全干工程师 - SegmentFault
  • iOS Provisioning Profile(Certificate)与Code Signing详解 - 曾梦想仗剑走天涯 - CSDN博客