在介绍真机运行调试之前,我们先介绍代码签名的概念。代码签名是 APP 之所以能够在真机上运行的基础!每个 iOS 开发者都必须跨过的坑!

 

1. 代码签名 Code Signing 也叫 App 签名,它是依靠 iOS 证书来进行的,它保证了 App 的合法性、完整性、真实性以及一致性(未被修改)。

 

2. 代码签名的核心是:证书、公钥、私钥。依赖于 X.509标准 与 公开密钥加密。

 

3. 在 Xcode 中设置代码签名非常简单,只需要设置 Targets -> Build Settings -> Code Signing Identity 设置好签名信息。
假如是正式发布的话,推荐手动设置签名证书!

 1581825321626874.png

 

4. 签名过程,在底层是由命令行工具 codesign 来完成的!当 Xcode 编译一个应用程序,在这个应用构建完成后就会自动调用 codesign 命令来进行签名!

 

5. 为了试验签名,我们先制作一个假的应用文件 apptest.app 做测试用。

 

$ cat apptest.app

hello world!

 

6. 公钥和私钥都完整可用的证书,才可以用来对代码进行签名,使用 security 命令,可以查看系统中的这类证书。这里需要记下 identity 的全称供后续使用。
$ security find-identity -v -p codesigning

  

7. 通过 codesign 命令使用上面的 identity ,对文件进行签名,期间需要授权允许使用用户本地的私钥。

 1581825353738064.png 

8. 查看下已被签名的应用的信息。

注意,假如是一个正常的程序包,那么 Format 那里应该显示类似 “bundle with Mach-O thin (arm64)” 的信息。

 

4.png

 

9. 检查一下当前的签名是否完美,即未被破坏。no news is good news!
$ codesign —verify apptest.app

 

10. 尝试破坏一下签名,再验证,果然发现问题了!

1581825403643512.png

 

11. 在实际对 App Bundle 的打包中,签名过程会在程序包中新建一个 _CodeSignature/CodeResources 的 plist 格式的文件,这个文件存储了被签名的程序包中所有资源文件的签名!

 

——————————————————————————–

 

12. 代码签名的验证主要是通过配置文件 Provisioning Profile(PP文件)与个人私钥 Private Key 共同完成。
(实际上,这个验证是通过 PP 文件里面的证书中的个人公钥 Public Key ,以及个人私钥 Private Key 共同完成的。)

 

13. 还记得我们在请求 Certificate 的时候,生成的 CSR 文件吗?这实际上是一个公钥/私钥对。私钥用于对代码进行签名,公钥用于验证。
我们可以在 Keychain 看到证书的公钥信息,以及与之配对的个人私钥(专用密钥)。

 6.png 

14. 假如上面的私钥被删除,或者没了,那么就不能对代码进行签名,也就无法使用这个证书了。假如私钥被别人获取了,别人更可以“代替”你来发布 App 了!因此一定要保存好自己的私钥,最好是导出来保存在安全地方!

 7.png

 

15. 选择 ”个人信息交换(.p12)” 文件格式,导出 .p12 文件!
由于 p12 文件包含个人信息,所以必须要密码。

8.png

16. 如果选择 “证书(.cer)” 文件格式,则导出证书文件本身!(也可以从 Apple Developer Member Center 下载

  9.png

17. 这样,如果想和别人或者其它设备共享证书时,只要把 p12 文件传给他,然后他就可以使用证书里面的私钥对代码进行签名了。

 10.png

 

18. 代码签名:对指定信息使用哈希 Hash 算法,得到固定长度的信息摘要 Signature,然后再使用私钥 Private Key 对摘要进行加密,就得到了数字签名。

 

 

19. 代码签名的验证过程分两步:

 

第一步,验证证书本身的可信性与完整性:
1)在 iOS 系统以及其它 Mac 设备内部,都拥有苹果的根证书 AppleWWDRCA.cer,里面包含了 Apple 的公钥。
2)用 Apple 的公钥对证书(.cer)中包含的数字签名进行解密,如果成功得到(经过 Apple 使用私钥加密过的)信息摘要 Signature1,则说明了证书的可信性。
3)然后对证书内容使用证书声明的哈希算法,计算出一个信息摘要 Signature2。
4)如果 Signature1 == Signature2,则说了明证书的完整性。

 

第二步,验证代码的可信性与完整性:
1)在证书可信的前提下,成功提取出用户的真实公钥 Public Key。这个公钥就可以用于检验代码签名,或者用于加密通信。
2)用真实的用户公钥对 CodeSignature 里面所有代码/资源签名进行解密,得到一系列信息摘要 Signature-a1、Signature-b1、Signature-c1 etc.
3)假如所有信息摘要都正确被机密出来,则表明代码、资源文件是可信的,是完整的,能够合法地在该设备上运行。


评论(0条)

请登录后评论
admin

admin

0

0

0

( 利码汇站长感谢您的支持! )