Skip to content

about ios codesigning

liubin ouyang edited this page Jun 11, 2017 · 1 revision

关于iOS应用签名

iOS App 签名的原理 这篇文章对原理讲解很清楚。

如果要对iOS应用安装包做自动签名,需要提供以下信息:

  1. 私钥和证书,一般是以p12文件的形式提供,同时也要提供p12文件的密码。
  2. Provisioning Profile:包含了 证书 / Entitlements ,测试设备的device id等数据。

日常做持续集成的过程中,基本流程如下:

  1. 创建一个专门用于签名的Keychain。
  2. 解锁Keychain。
  3. 将证书、私钥(p12文件)导入keychain。
  4. 根据Provisioning Profile确定identity 并生成 entitlements.plist。
  5. 执行security set-key-partition-list,具体原因参考 security / codesign in Sierra: Keychain ignores access control settings and UI-prompts for permission
  6. 解压安装包。
  7. 重签名,指定identity和entitlements。
  8. 压缩生成新的安装包。

一段示例shell代码如下:

INPUT_PACKAGE=/data/work/app.ipa
OUTPUT_PACKAGE=/data/work/app-development-signed.ipa
TEMP_PATH=/tmp/codesign/
P12_FILE=/data/work/development_key_and_certificate.p12 
P12_PASSWORD=1234
PROVISION_PROFILE=/data/work/development.mobileprovision
IDENTITY="iPhone Developer: Ze Ming (T5FWQ2TQ69)"

cd $HOME/Library/Keychains/
rm -f build.keychain build.keychain-db 
security create-keychain -p mysecretpassword build.keychain
security list-keychain -s build.keychain login.keychain
security unlock-keychain -p mysecretpassword build.keychain
security set-keychain-settings -l build.keychain
security import $P12_FILE -P $P12_PASSWORD -k build.keychain -T /usr/bin/codesign

# https://stackoverflow.com/a/40039594/223545
security set-key-partition-list -S apple-tool:,apple: -s -k mysecretpassword build.keychain

security find-identity -v build.keychain

rm -rf $TEMP_PATH
mkdir -p $TEMP_PATH
unzip -d $TEMP_PATH $INPUT_PACKAGE >/dev/null
app_path=$(find $TEMP_PATH -type d -iname '*.app')

rm -rf $app_path/_CodeSignature/*
cp $PROVISION_PROFILE $app_path/embedded.mobileprovision

/usr/bin/codesign --deep --force --verbose --keychain build.keychain --sign "$IDENTITY" "$app_path"
cd $TEMP_PATH && zip -r $OUTPUT_PACKAGE .
Clone this wiki locally