iOS 证书管理、验证、打包流程

  1. 背景

    iOS软件的开发和发布离不开证书和配置文件,如果要想发布app到Apple Store或者使用苹果的推送通知功能,都需要个人开发者证书签名该app,以便通过苹果的认证和审核。由于我们公司的app不是单独一个,而是一个客户对应一个app,在新版本中,需要用到推送通知功能,就需要发布app到Apple Store,通过认证后才能正常使用苹果提供的这个服务,同时,为了满足部分客户要把自己的app发布到Apple Store 的需求,因此,我们需要使用这部分功能的客户上传他们的个人开发者证书和相关文件。 这时,就需要对这些证书进行验证和管理,以及在打包时,动态导入这个证书并签名,这篇文章主要是为了记录相关的原理、验证证书、打包等技术点的实现细节。

  2. 专业词汇

  • 签名证书:

    签名证书是用来在编译代码后进行代码签名的,主要是为了说明这个代码的所有者和合法性。通过iOS7 的SDK编译时,在编译的时候就需要指定签名证书,当然我们仍然可以在编译后进行重签名。

  • 推送证书:

    推送证书主要我们的服务器发送推送信息给苹果服务器时,需要用到的认证证书,打包的时候不需要用到,仅仅是我们后台与苹果服务器通讯时需要。

  • AppId:

    每个应用都有唯一的AppId,全球唯一,是应用的一个标识。推送证书在生成时会要求指定AppId,因此一个推送证书对应唯一的AppId。

  • 配置文件:

    配置文件包含了以上几乎所有的信息,包括这个应用的AppId,应用对应的签名证书,应用是否开启了推送功能,应用是开发版本还是发布版本,应用能够被哪台手机安装(对于发布版本的应用,是所有手机都可以安装的)。


验证、获取证书的信息

  1. 签名证书:后缀主要为 .p12,同时需要用户输入导入该证书的密码

    在这个签名证书里面,可以获得UID、证书名称、证书有效期。在linux或mac下,使用openssl 来获取相关的信息,命令如下:

    (1) openssl pkcs12 -in ~/cert.p12 -nodes -passin pass:"my password" | openssl x509 -noout –text
    可以输出所有我们需要的信息,但是需要进行检索和解析。

    (2) openssl pkcs12 -in ~/cert.p12 -nodes -passin pass:"my password" | openssl x509 -noout –dates
    可以输出证书的有效期

    (3) openssl pkcs12 -in ~/cert.p12 -nodes -passin pass:"my password" | openssl x509 -noout –subject
    可以输出证书的UID和证书名称

  2. 推送证书(可选):后缀主要为 .p12,同时需要用户输入该证书的密码 在这个签名证书里面,同样可以获得UID、证书名称、证书有效期、以及是否是推送通知类型的证书。命令同上。 如何判断此 .p12文件是推送证书???下图高亮处,后面跟着AppId

  3. 配置文件:后缀为 .mobileprovision

    从这个配置文件中可以获得AppId、有效期、证书类型,是开发版本还是发布版本等等。方法如下:

    (1) 先把这个配置文件转成xml,再解析,命令:

    openssl smime -inform der -verify -noverify -in file.mobileprovision。

(2) xml节点说明:

配置文件生成的日期

<key>ExpirationDate</key>
<date>2014-10-28T03:19:05Z</date>
    配置文件过期的时间

    <key>application-identifier</key>
<string>KZV5N634G4.com.mdby.motan2.testForPush</string>
    应用标识符,全球唯一,红色部分需要在打包时传给打包程序

就是,我所说的AppId

<key>aps-environment</key>
<string>development</string>

<key>aps-environment</key>
<string>production</string>
   判断该证书是发布版本,还是开发版本,当然,我们可以通过其他的标志来判断。

<key>UUID</key>
<string>855C845A-2E51-414F-A29B-837AD1A67F67</string>

是一个唯一标识符,我们要想在工程中使用这个配置文件,一般是双击,然后在xcode 的工程中,就可以选择这个配置文件了,其实那是系统解析了这个mobileprovision文件,提取里面的UUID,用这个UUID重新命名这个mobileprovision文件,然后将这个文件放到Mac 系统的~/Library/MobileDevice/Provisioning Profiles/这个目录下。在Xcode 的工程中,就是默认在这个路径下寻找可用的mobileprovision文件。因此我们编译和打包前,需要通过这个UUID重新命名服务器端传过来的mobileprovision文件,并放到上面那个目录下,从而在打包命令中直接通过UUID指定配置文件。


推送证书制作

实际上,客户所上传的那个.p12后缀的推送证书,并不能直接用来推送信息,需要把里面的证书和私钥同时提取到一个 .pem后缀的文件中,利用这个文件与Apple 服务器端通信。步骤如下:

  • p12文件中提取证书

    openssl pkcs12 -in mykeystore.p12 -clcerts -nokeys -out mycert.pem -passin pass:"mdby2013"

  • p12文件中提取私钥

    openssl pkcs12 -nocerts -out mykey.pem -in push.p12 -passin pass:"mdby2013" -passout pass:"mdby2013"

  • 合并cert和key

    cat PushChatCert.pem PushChatKey.pem > ck.pem


编译、签名、打包

0、在低版本的command line 工具中,需要导入一个参数

export CODESIGN_ALLOCATE="/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/codesign_allocate"

1、解锁Mac的钥匙串

security unlock-keychain -p $1 "~/Library/Keychains/login.keychain"

$1是登录系统钥匙串的密码

2、导入签名证书到Mac的钥匙串

security import /Users/mrghappy/app/mdby.p12 -k ~/Library/Keychains/login.keychain -P "$2" –A

$2是导入证书的密码,这个是客户在导出他们的签名证书时,填写的密码 -A 表示这个证书对任意应用可用,有安全风险,需要谨慎,加上这个是为了不要每次打包使用该证书签名时,总是弹出警告框,要求输入密码。

3、查看钥匙串中是否有该导入的证书

security find-certificate -a -c "$2" -Z | grep ^SHA-1

$2 是证书的名称,该命令会列举出具有这个名称的系统内的证书。

4、clean项目

xcodebuild  clean

5、build项目

xcodebuild-target motan -configuration Release build PLATFORM_NAME=iphoneos BUILDSDK=/Developer-SDK7
CODE_SIGN_IDENTITY="$2"  
PROVISIONING_PROFILE="$3"

其中$2变量是签名证书对应的证书名称。$3是配置文件对应的UUID

6、签名、打包

xcrun -sdk iphoneos PackageApplication -v  /Users/mrghappy/app/build/Release-iphoneos/$4.app  -o  /Users/mrghappy/app/build/Release-iphoneos/$4.ipa --sign "$2" --embed /Users/mrghappy/app/mdby.mobileprovision

其中$4是这个项目的名称,--sign是指定签名证书签名,--embed 是打包时把配置文件打包进去。

7、当然,我们可以验证一下打包好的ipa文件是否正确

codesign -d -vvv --file-list - /Users/mrghappy/app/build/Release-iphoneos/$4.app

8、为了防止钥匙串中导入的证书过多,维护困难,我们可以在打包完后,删除掉

security delete-certificate -c "$2" ~/Library/Keychains/login.keychain
原文地址:https://www.cnblogs.com/YungMing/p/4016511.html