跳到主要内容
本页目录

证书与签名

没有证书也能编译,但装不进手机。准备好 .p12 和 .mobileprovision 放进证书目录,之后每次构建自动签名;工程里怎么指定证书、命令行怎么临时覆盖。

设置签名证书

把 .p12 证书、.mobileprovision 描述文件和密码文件 password.properties 放进 keychain 证书目录。还没有证书和描述文件的,先看下文创建证书和描述文件。

证书目录可以放在两个位置,两处的证书会合并使用:

  • 工程目录/keychain/:只对这个工程生效
  • KXBUILD_HOME/keychain/:所有工程共用。默认 Windows 是 %USERPROFILE%\kxbuild\keychain\,WSL、Linux、macOS 是 ~/kxbuild/keychain/

macOS 上也可以直接用系统钥匙串里的证书。

keychain\
├─ development.p12
├─ distribution.p12
├─ MyApp_Dev.mobileprovision
├─ MyApp_AppStore.mobileprovision
└─ password.properties

password.properties 每行一张证书,格式为「文件名=密码」,文件名和 .p12 完全一致,密码不加引号。

development.p12=123456 distribution.p12=123456

放好之后每次构建按工程中的签名设置自动签名,不需要在 KXBuild 中配置。没有证书也能编译,只是产物不签名、装不进手机。

创建证书和描述文件

需要两个文件:包含私钥的 .p12 证书和 .mobileprovision 描述文件,类型见文末的证书类型和描述文件类型表。Development 描述文件换手机时,要在开发者账号里加入新手机的 UDID 后重新下载。

两个文件都来自 Apple 开发者账号,Windows 上有三种获取方式。

1

用 Appuploader 生成(推荐)

Windows 上的 App Store 辅助工具,用开发者账号登录后可以直接创建证书、导出 .p12、创建和下载描述文件。上架时也会用到它。

2

从 Mac 导出

在「钥匙串访问」中把证书连同私钥导出为 .p12,再从 developer.apple.com 下载描述文件。只有 .cer 文件不行,其中没有私钥。

3

用 OpenSSL 生成

生成私钥和 CSR,在 developer.apple.com 的 Certificates 页上传 CSR 下载 .cer,再合成 .p12。

> openssl req -new -newkey rsa:2048 -nodes -keyout ios.key -out ios.csr -subj "/emailAddress=you@example.com/CN=Your Name/C=CN"
> openssl x509 -in development.cer -inform DER -out development.pem
> openssl pkcs12 -export -inkey ios.key -in development.pem -out development.p12

kxbuild 内部是如何选择证书的

和 Xcode 一样,按工程里的签名设置(工程设置编辑器的 General → Signing)从证书目录中挑选,分三步:

1

选证书类型

签名身份 CODE_SIGN_IDENTITY 是 Apple Development 就用开发证书,是 Apple Distribution 就用发布证书。

2

选团队

只用团队 DEVELOPMENT_TEAM 下的证书和描述文件。

3

选描述文件

自动签名(Automatic)按 Bundle ID 和团队自动匹配;手动签名(Manual)按 PROVISIONING_PROFILE_SPECIFIER 里填的描述文件名查找。

新建的工程默认是 Apple Development 加自动签名,日常开发不需要改。

命令行里不想改工程文件,可以用 -D 临时覆盖:

打 App Store 包时换成发布证书:

> kxbuild build .\MyApp.xcodeproj -c Release -D CODE_SIGN_IDENTITY="Apple Distribution"

只编译,不签名:

> kxbuild build .\MyApp.xcodeproj -D CODE_SIGNING_ALLOWED=NO

构建报 No signing certificate matching '…' found,说明证书目录里没有工程要求的证书类型或团队。放入对应的 .p12,或者用上面的 -D 换成目录里已有的证书。

证书类型

证书(.p12)证明 App 是谁签的。常用的几种:

证书作用搭配的描述文件
Apple Development开发调试:装到测试手机上运行、断点调试Development
Apple Distribution发布:上传 App Store / TestFlight,Ad Hoc 测试分发,企业账号的内部分发App Store Connect、Ad Hoc、In-House
iOS App Development旧版开发证书,作用同 Apple Development,仍然可用Development
iOS Distribution旧版发布证书,作用同 Apple Distribution,仍然可用App Store Connect、Ad Hoc、In-House
Apple Push Notification service SSL服务器发送推送通知用,不用来给 App 签名,不要放进证书目录—

描述文件类型

描述文件(.mobileprovision)规定这个 App 能用哪张证书签名、能装到哪些手机上。它绑定了 Bundle ID,必须和工程里的一致。常用的几种:

描述文件作用证书设备限制
Development开发调试,Debug 构建用Apple Development只能装到描述文件里登记了 UDID 的手机
Ad Hoc不经过 App Store,把测试包发给少量测试人员Apple Distribution只能装到登记了 UDID 的手机,每类设备每年最多 100 台
App Store Connect上传 App Store Connect,用于 TestFlight 和上架Apple Distribution不能直接装到手机,经 TestFlight 或 App Store 安装
In-House企业账号内部分发,员工直接安装Apple Distribution(企业账号)不限设备,只能在企业内部使用

接下来