了解iOS 应用签名

2020-06-03  本文已影响0人  jayhe

我们知道苹果的签名验证采用的是双重非对称加密验证
mac电脑有一对公钥、私钥(p12),这里我们标记为“公钥M”、“私钥M”
苹果服务器和iOS设备分别对应有一对私钥、公钥,这里我们标记为“公钥A”、“私钥A”

证书-cers

image

此时会得到一个CertificateSigningRequest.certSigningRequest文件,我们将其简称为CSR文件

openssl asn1parse -i -in CertificateSigningRequest.certSigningRequest

在终端通过openssl指令可以看到信息如下:


0:d=0  hl=4 l= 645 cons: SEQUENCE         

    4:d=1  hl=4 l= 365 cons:  SEQUENCE         

    8:d=2  hl=2 l=  1 prim:  INTEGER          :00

  11:d=2  hl=2 l=  64 cons:  SEQUENCE         

  13:d=3  hl=2 l=  32 cons:    SET             

  15:d=4  hl=2 l=  30 cons:    SEQUENCE         

  17:d=5  hl=2 l=  9 prim:      OBJECT            :emailAddress

  28:d=5  hl=2 l=  17 prim:      IA5STRING        :1054134542@qq.com

  47:d=3  hl=2 l=  15 cons:    SET             

  49:d=4  hl=2 l=  13 cons:    SEQUENCE         

  51:d=5  hl=2 l=  3 prim:      OBJECT            :commonName

  56:d=5  hl=2 l=  6 prim:      UTF8STRING        :贺超

  64:d=3  hl=2 l=  11 cons:    SET             

  66:d=4  hl=2 l=  9 cons:    SEQUENCE         

  68:d=5  hl=2 l=  3 prim:      OBJECT            :countryName

  73:d=5  hl=2 l=  2 prim:      PRINTABLESTRING  :CN

  77:d=2  hl=4 l= 290 cons:  SEQUENCE         

  81:d=3  hl=2 l=  13 cons:    SEQUENCE         

  83:d=4  hl=2 l=  9 prim:    OBJECT            :rsaEncryption

  94:d=4  hl=2 l=  0 prim:    NULL             

  96:d=3  hl=4 l= 271 prim:    BIT STRING       

  371:d=2  hl=2 l=  0 cons:  cont [ 0 ]       

  373:d=1  hl=2 l=  13 cons:  SEQUENCE         

  375:d=2  hl=2 l=  9 prim:  OBJECT            :sha256WithRSAEncryption

  386:d=2  hl=2 l=  0 prim:  NULL             

  388:d=1  hl=4 l= 257 prim:  BIT STRING   

这里我们将申请的信息以及“公钥M”一起打包发给苹果服务器,苹果服务器使用“私钥A”对信息进行加密,然后生成证书;这个证书则可以通过手机的“公钥A”进行解密

openssl x509 -text -in xxx.cer -out xxx.text

xxx.cer为证书的名称,xxx.text输出的文件名

唯一标识符-Identifiers

iOS设备安装应用时用来识别不同App的唯一标识;应用分身就是用不同的Identifier然后重签名ipa包安装到手机上

描述文件

.cer文件只是声明了证书的类型,比如Apple Development、Apple Distribution、APNs推送等等,而使用什么证书打包及证书的有效期、AppID是什么、打包的App包含了哪些功能、可以在哪些设备上安装,则是通过Provisioning Profile 描述文件(.mobileprovision后缀)来说明的,苹果后台将所有这些信息组合后再使用Apple私钥进行签名,最后生成Provisioning Profile描述文件

我们Mac电脑中的描述文件存放在:~/Library/MobileDevice/Provisioning\ Profiles目录中,我们查看下描述文件都包含哪些信息,终端执行以下命令

security cms -Di xxx.mobileprovision


<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">

<dict>

<key>AppIDName</key>

<string>XC hc RuntimeLearning</string>

<key>ApplicationIdentifierPrefix</key>

<array>

<string>L2ZY2L7GYS</string>

</array>

<key>CreationDate</key>

<date>2020-05-30T09:41:36Z</date>

<key>Platform</key>

<array>

<string>iOS</string>

</array>

<key>IsXcodeManaged</key>

<true/>

<key>DeveloperCertificates</key>

<array>

<data>加密的内容</data>

<data>加密的内容</data>

</array>

<key>Entitlements</key>

<dict>

<key>application-identifier</key>

<string>L2ZY2L7GYS.hc.RuntimeLearning</string>

<key>keychain-access-groups</key>

<array>

<string>L2ZY2L7GYS.*</string>

</array>

<key>get-task-allow</key>

<true/>

<key>com.apple.developer.team-identifier</key>

<string>L2ZY2L7GYS</string>

<key>com.apple.security.application-groups</key>

<array>

<string>group.hc.demo</string>

</array>

</dict>

<key>ExpirationDate</key>

<date>2020-06-06T09:41:36Z</date>

<key>Name</key>

<string>iOS Team Provisioning Profile: hc.RuntimeLearning</string>

<key>ProvisionedDevices</key>

<array>

<string>2e9d3a0d88ccbf9deb2efa12ea042187ef3d0ada</string>

<string>00008020-00182C413A90003A</string>

</array>

<key>LocalProvision</key>

<true/>

<key>TeamIdentifier</key>

<array>

<string>L2ZY2L7GYS</string>

</array>

<key>TeamName</key>

<string>chao he</string>

<key>TimeToLive</key>

<integer>7</integer>

<key>UUID</key>

<string>46ae42b4-6862-4d4b-9890-cc0fdf42eca2</string>

<key>Version</key>

<integer>1</integer>

</dict>

</plist>

这里推荐一个在mac下查看描述文件的插件[ProvisionQL](https://github.com/ealeksandrov/ProvisionQL),直接选择描述文件按空格就能看到详细信息

权限文件-entitlements

App使用到的各种权限(APNs、HealthKit、iCloud等),也是需要Apple验证通过后才能生效的,Apple将这些权限开关统一称为Entitlements。当第一次在Xcode中勾选权限时,项目中会自动生成一个.entitlements后缀的文件,里面记录了App所拥有的权限。

AppStore签名

1. 电脑端使用证书对应的私钥p12对可执行文件MachO、资源、以及Frameworks、Plugins等进行签名打包成ipa包
2. 上传ipa包到苹果服务器
3. 苹果服务器使用私钥A对app数据进行加密签名
4. 用户通过AppStore下载包之后使用手机中的公钥A进行解密验证,验证通过后安装成功

步骤1中的操作都是由Xcode帮我们完成,签名的过程也是帮我们处理了,可以在Xcode的日志中看到

非AppStore渠道分发

1. 电脑端使用证书对应的私钥p12对可执行文件MachO、资源、以及Frameworks、Plugins等进行签名打包成ipa包
2. 打包的过程中会将描述文件Provisioning Profile命名为embedded.mobileprovision放入到打包app中
3. 手机端安装或者启动,使用内置的公钥A验证embedded.mobileprovision是否有效设备是否在安装列表,同时验证证书签名是否有效,这包括证书的有效期(个人的调试证书有效期7天)同时取出证书中的公钥M
4. 由于app的签名是用私钥M签名的,手机拿到公钥M可以对app进行签名校验,包括AppID是否对应、权限开关是否跟app里的entitlements一致等等

上一篇 下一篇

猜你喜欢

热点阅读