关于重新签名

Author Avatar
A Man Has No Name 6月 08, 2017
  • 在其它设备中阅读本文章

IOS签名

证书和密钥

苹果的证书都是由苹果签发的,一般都会带有一个有效期。

p12是什么

查找自己拥有的证书以及私钥

  • 打开Mac种的 钥匙串

查找自己的证书

  • 全选,然后右键导出,这时候,需要你输入密码,最后,你就可以到处一个XX.p12的证书文件

security命令是什么

这个命令,可以查找显示系统中用来签名认证的方法。

1
2
3
$ security find-identity -v -p codesigning
1) 01C8E9712E9632E6D84EC533827B4478938A3B15 "iPhone Developer: Thomas Kollbach (7TPNXN7G6K)"

对于IOs开发者来说,一般会涉及到两个证书,前缀含有

  • iPhone Developer, 可以使设备在你的测试设备上运行。
  • iPhone Distribution,提交APP Store时使用。

钥匙串 中打开其中一个证书,在最后下面一条中有标记 Apple Developer Certificate (Submission), 或者 Apple Developer Certificate (Development), IOS系统会通过这些判断,你到底运行在哪一个模式中。用来判断运行规则。

我们签名时候,需要用到私钥(于公钥成对)。

签名工具 codesign

codesign 对APP进行重新签名

1
$ codesign -fs "iPhone Developer: Thomas Kollbach (7TPNXN7G6K)" --no-strict XXX.app

codesign 也可以查看文件签名状态信息,用来定位错误。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
$ codesign -vvv -d X.app
Executable=/Users/toto/Library/Developer/Xcode/DerivedData/Example-cfsbhbvmswdivqhekxfykvkpngkg/Build/Products/Debug-iphoneos/Example.app/Example
Identifier=ch.kollba.example
### 支持的格式,比如arm64
Format=bundle with Mach-O thin (arm64)
CodeDirectory v=20200 size=26663 flags=0x0(none) hashes=1324+5 location=embedded
Signature size=4336
### 注意这一行,它表示签名证书
Authority=iPhone Developer: Thomas Kollbach (7TPNXN7G6K)
### 被谁设置了签名
Authority=Apple Worldwide Developer Relations Certification Authority
### 上面那个证书的 根证书
Authority=Apple Root CA
Signed Time=29.09.2014 22:29:07
Info.plist entries=33
TeamIdentifier=DZM8538E3E
Sealed Resources version=2 rules=4 files=120
Internal requirements count=1 size=184

codesign 验证签名是否完善

1
2
3
# 如果验证失败,那么就会输出stderr哦
$ codesign --verify XX.app

Entitlements 和 Provisioning

沙盒

IOS中,无论用户和开发者不能允许改变应用的开启策略,也就是你必须有对应的发布证书才能在IOS上运行。

你的应用可以做的事情,是受到沙盒 管理的。而,代码沙盒签名机制是不同的。

代码签名,保证APP内容完整,没有被篡改。
沙盒,限制APP能访问哪些资源。听说,沙盒的授权机制是开发中,经常出问题的。

授权机制

查看授权信息

1
$ codesign -d --entitlements - XX.app

Provisioning 配置文件

用来联系,代码签名,沙盒机制。

这个配置文件是一个使用CMS(Cryptographic Message Syntax)的一个加密文件。

于是,你一旦从品过开发者中心得到这个文件,那么这个文件,你是不能改的。注意,这个签名,和我们对应用的签名是不一样的

security 可以用来查看配置文件

1
$ security cms -D -i embedded.mobileprovision
  1. 配置文件中的内容,用语判断一个APP是否可以运行在某个设备上,每一个配置文件都有自己的UUID,
  2. DeveloperCertificates, 这时一个列表。包含了,可以使用这个配置文件的应用红的签名的所有证书。那么,如果你的签名证书不在列表中,那么这个应用就不能运行。
  3. 所有的证书都是基于 Base64的PEM格式。
  4. 如果需要查看证书内容,那么就需要把内容复制出来,然后改名成a.pem

    1
    $ openssl x509 -text -in a.pem
  5. 在这个文件中,Entitlements, 也包含了授权信息。

  6. 如果,你的开发证书,那么,你会看到一项 ProvisionedDevices,这里面又所有用语测试的设备列表。因为配置文件需要被苹果,签名。所以,每次需要重新下载。

签名步骤:

  1. rm -r ./Payload/xxxx.app/_CodeSignature/*
  2. cp /data/work/keychains/profile/13b42794011c.mobileprovision ./Payload/xxxx.app/embedded.mobileprovision
  3. /usr/bin/codesign -f -s "iPhone Distribution: XXXXX." --entitlements /data/work/keychains/keychain/xxxx.demo_entitlements.plist ./Payload/xxxx.app
  4. 搞定

苹果的 Info.plist

苹果的Plist有两种格式,一种是XML格式,还有一种是 二进制格式(bplist, Binary Plist)。

一般来讲,文件头:

文件头 对象表 偏移表 文件尾
开头8字节 8~K字节 K+L*N字节 最后32字节

固定文件都是:

格式: 6 , 定值:62 70 6C 69 73 74 表示: bplist
版本: 2 ,定值: 30 30 表示:00

所以固定是: 62 70 6C 69 73 74 30 30

创建keychain

1
security create-keychain -p mysecretpassword build.keychain