在 Windows 上申请 iOS 开发证书、描述文件和 p12
iOS App 装到手机和上架都要签名,签名需要证书(.p12)和描述文件(.mobileprovision)。Apple 官方的申请流程要在 Mac 的「钥匙串访问」里生成 CSR,本文用 OpenSSL 在 Windows 上完成同样的事,从生成私钥一直做到 KXBuild 能用这些文件签名。需要准备已加入 Apple Developer Program 的账号、一台 iPhone 和数据线,整个过程大约二十分钟。
KXBuild 不会替你在 Apple 后台创建证书,它只读取你放进证书目录的文件。除了本文的 OpenSSL 做法,也可以用 Appuploader 这类工具登录开发者账号直接生成,见证书与签名。
先分清要申请哪些
| 证书 | 什么时候用 | 配合的描述文件 |
|---|---|---|
| Apple Development | 装到自己的测试机上运行、断点调试 | iOS App Development,要包含设备 UDID |
| Apple Distribution | 上传 App Store Connect、TestFlight,或打 Ad Hoc 包发给测试人员 | App Store Connect,或 Ad Hoc(要包含设备 UDID) |
刚开始开发只需要 Apple Development 证书和一份 Development 描述文件,准备上架时再申请 Apple Distribution。两类证书的申请步骤完全一样,下文以开发证书为例。
证书有效期一年。一个团队的发布证书数量有上限,团队成员之间应当共用同一张发布证书,而不是每人申请一张;开发证书可以每人一张。
用 OpenSSL 生成私钥和 CSR
CSR(证书签名请求)包含你的公钥,交给 Apple 签发证书;对应的私钥留在本机,之后合成 .p12 要用。
Windows 没有自带 OpenSSL,装了 Git for Windows 的已经有一份,位置是 C:\Program Files\Git\mingw64\bin\openssl.exe。下面的命令在 PowerShell 中执行,先把它存进一个变量。没有装 Git 的,也可以用 winget 或其他渠道安装 OpenSSL,把 & $openssl 换成 openssl 即可。
1$openssl = "C:\Program Files\Git\mingw64\bin\openssl.exe"
2mkdir D:\ios-cert; cd D:\ios-cert
3& $openssl req -new -newkey rsa:2048 -nodes -keyout ios.key -out ios.csr -subj "/emailAddress=you@example.com/CN=Your Name/C=CN"
emailAddress 和 CN 换成你的邮箱和名字,Apple 签发证书时会用账号上的团队信息,这里的值只影响 CSR 本身。执行后目录里得到两个文件,ios.key 是私钥,ios.csr 是要上传的请求。
在 Git Bash 中执行同样的命令时,以
/开头的-subj参数会被当成路径改写,命令前加MSYS_NO_PATHCONV=1可以避免。在 PowerShell 中执行没有这个问题。
ios.key 必须妥善保管。 丢了私钥,这张证书就不能再签名,只能吊销后重新申请。
上传 CSR 下载证书
- 登录 developer.apple.com,进入 Certificates, Identifiers & Profiles,打开 Certificates 页,点加号。
- 选择 Apple Development(发布证书选 Apple Distribution),点 Continue。
- 上传 ios.csr,点 Continue。
- 点 Download,得到 development.cer(发布证书下载后通常叫 distribution.cer)。
下载的 .cer 是 DER 格式,只含证书,不含私钥,单独拿它不能签名。
合成 p12
先把 .cer 转成 PEM 格式,再和私钥合成 .p12。第二条命令会让你输入两次导出密码,这个密码之后要写进 password.properties。
1& $openssl x509 -in development.cer -inform DER -out development.pem
2& $openssl pkcs12 -export -inkey ios.key -in development.pem -out development.p12
Git for Windows 自带的是 OpenSSL 3,默认用 AES-256 加密 .p12,KXBuild 可以直接读取。同一个文件还要导入 Mac 的钥匙串或其他较老的签名工具时,它们可能报密码错误,这时加上 -legacy 重新导出一份兼容格式。
1& $openssl pkcs12 -export -legacy -inkey ios.key -in development.pem -out development.p12
可以用下面的命令确认 .p12 里同时有证书和私钥,输出中能看到 Certificate bag 和 Shrouded Keybag 两行即可。
1& $openssl pkcs12 -in development.p12 -info -noout
注册 App ID
在 Identifiers 页点加号,选 App IDs → App,填写描述和 Bundle ID。
- Explicit(精确) 填完整的 Bundle ID,如 com.example.myapp,和工程里的 PRODUCT_BUNDLE_IDENTIFIER 一致。要用推送、iCloud、Sign in with Apple、App Groups 等能力必须选这种,并在下方 Capabilities 里勾选。
- Wildcard(通配) 如 com.example.*,一个描述文件覆盖多个 App 和扩展,只适合开发阶段、没有用到上述能力的工程。
工程里有 Widget、通知扩展等扩展 target 的,每个扩展的 Bundle ID(如 com.example.myapp.widget)也要各注册一个 App ID。工程中各 target 的 Bundle ID 可以用 kxbuild project info .\MyApp.xcodeproj 查看。
添加测试设备
Development 和 Ad Hoc 描述文件只允许安装到注册过的设备,先拿到手机的 UDID。
用数据线把 iPhone 连到电脑,解锁并点「信任此电脑」,然后运行下面的命令,第一列就是 UDID。第一次连接要装设备驱动,按设备准备操作。
1kxdevice device list
装了 iTunes 的也可以在设备摘要页点击「序列号」一栏,切换出 UDID;第三方设备管理工具的设备信息页一般也能直接复制。
在 Devices 页点加号,Platform 选 iOS,填设备名和 UDID,点 Continue 保存。每类设备每个会员年度最多注册 100 台,删掉的设备在本年度内仍然计数,不要随手注册。
生成描述文件
- 在 Profiles 页点加号。开发选 iOS App Development;上架选 App Store Connect;发给测试人员直接安装选 Ad Hoc。
- 选择上一步的 App ID。
- 勾选要允许的证书。Development 描述文件可以同时勾选团队所有人的开发证书,一份文件大家共用。
- Development 和 Ad Hoc 类型勾选要安装的设备。App Store Connect 类型没有这一步。
- 起一个好认的名字,如 MyApp_Dev,点 Generate,然后 Download 得到 MyApp_Dev.mobileprovision。
描述文件在生成的那一刻就把证书、设备和能力固定下来。之后新增设备、给 App ID 开通新能力、换了证书,都要回到 Profiles 页编辑这份描述文件,保存并重新下载,否则构建或安装会报错,具体报错和处理见iOS 签名报错与 ipa 安装失败的解决办法。
放进 KXBuild 的证书目录
证书目录有两个位置,工程根目录下的 keychain 只对该工程生效,KXBUILD_HOME 下的 keychain 所有工程共用,Windows 上默认是 %USERPROFILE%\kxbuild\keychain。把 .p12 和 .mobileprovision 放进去,并在同目录新建 password.properties,每行写一张证书的「文件名=密码」。
1keychain\
2├─ development.p12
3├─ MyApp_Dev.mobileprovision
4└─ password.properties
1development.p12=你导出时设的密码
文件名要和 .p12 完全一致,区分大小写,密码不加引号。放好之后构建时按工程中的签名设置自动选择证书和描述文件,不需要在 KXBuild 里另外配置,规则见证书与签名。
最后连上手机构建并安装一次,能在手机上打开 App 就说明证书、描述文件和设备都对上了。
1kxbuild build .\MyApp.xcodeproj --install
ios.key、ios.csr、.cer、.pem 这些中间文件不需要放进证书目录。
证书到期、续期和备份
到期前 Apple 会发邮件提醒。开发证书到期后,用它签名的开发版 App 装不上也打不开,重新构建即可;发布证书到期不影响已经在 App Store 上架的版本,但 Ad Hoc 包会失效,也不能再用它上传新构建。
续期 证书不能延长,只能申请一张新的。按本文步骤重新生成 CSR 上传即可,也可以沿用原来的 ios.key 再生成一份 CSR,省去管理新私钥。拿到新证书后合成新的 .p12,再到 Profiles 页编辑所有用到旧证书的描述文件,改选新证书,保存并重新下载,替换证书目录里的旧文件。
备份 把 ios.key 和合成好的 .p12 连同密码存进密码管理器或加密的团队共享盘,不要提交进代码仓库。换电脑、给构建服务器配证书时,直接复制 .p12 和 password.properties 即可,不用重新申请。
私钥丢了 在 Certificates 页吊销这张证书,重新走一遍申请流程。吊销发布证书前先和团队确认没有人正在用它出包。