背景node
iOS软件的开发和发布离不开证书和配置文件,若是要想发布app到Apple Store或者使用苹果的推送通知功能,都须要我的开发者证书签名该app,以便经过苹果的认证和审核。因为咱们公司的app不是单独一个,而是一个客户对应一个app,在新版本中,须要用到推送通知功能,就须要发布app到Apple Store,经过认证后才能正常使用苹果提供的这个服务,同时,为了知足部分客户要把本身的app发布到Apple Store 的需求,所以,咱们须要使用这部分功能的客户上传他们的我的开发者证书和相关文件。 这时,就须要对这些证书进行验证和管理,以及在打包时,动态导入这个证书并签名,这篇文章主要是为了记录相关的原理、验证证书、打包等技术点的实现细节。linux
专业词汇xcode
签名证书:安全
签名证书是用来在编译代码后进行代码签名的,主要是为了说明这个代码的全部者和合法性。经过iOS7 的SDK编译时,在编译的时候就须要指定签名证书,固然咱们仍然能够在编译后进行重签名。服务器
推送证书:app
推送证书主要咱们的服务器发送推送信息给苹果服务器时,须要用到的认证证书,打包的时候不须要用到,仅仅是咱们后台与苹果服务器通信时须要。iphone
AppId:ide
每一个应用都有惟一的AppId,全球惟一,是应用的一个标识。推送证书在生成时会要求指定AppId,所以一个推送证书对应惟一的AppId。工具
配置文件:ui
配置文件包含了以上几乎全部的信息,包括这个应用的AppId,应用对应的签名证书,应用是否开启了推送功能,应用是开发版本仍是发布版本,应用可以被哪台手机安装(对于发布版本的应用,是全部手机均可以安装的)。
签名证书:后缀主要为 .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和证书名称
推送证书(可选):后缀主要为 .p12,同时须要用户输入该证书的密码 在这个签名证书里面,一样能够得到UID、证书名称、证书有效期、以及是不是推送通知类型的证书。命令同上。 如何判断此 .p12文件是推送证书???下图高亮处,后面跟着AppId
配置文件:后缀为 .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"
一、解锁Mac的钥匙串
security unlock-keychain -p $1 "~/Library/Keychains/login.keychain"
$1是登陆系统钥匙串的密码
二、导入签名证书到Mac的钥匙串
security import /Users/mrghappy/app/mdby.p12 -k ~/Library/Keychains/login.keychain -P "$2" –A
$2是导入证书的密码,这个是客户在导出他们的签名证书时,填写的密码 -A 表示这个证书对任意应用可用,有安全风险,须要谨慎,加上这个是为了避免要每次打包使用该证书签名时,老是弹出警告框,要求输入密码。
三、查看钥匙串中是否有该导入的证书
security find-certificate -a -c "$2" -Z | grep ^SHA-1
$2 是证书的名称,该命令会列举出具备这个名称的系统内的证书。
四、clean项目
xcodebuild clean
五、build项目
xcodebuild-target motan -configuration Release build PLATFORM_NAME=iphoneos BUILDSDK=/Developer-SDK7 CODE_SIGN_IDENTITY="$2" PROVISIONING_PROFILE="$3"
其中$2变量是签名证书对应的证书名称。$3是配置文件对应的UUID
六、签名、打包
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 是打包时把配置文件打包进去。
七、固然,咱们能够验证一下打包好的ipa文件是否正确
codesign -d -vvv --file-list - /Users/mrghappy/app/build/Release-iphoneos/$4.app
八、为了防止钥匙串中导入的证书过多,维护困难,咱们能够在打包完后,删除掉
security delete-certificate -c "$2" ~/Library/Keychains/login.keychain