Windows OpenSSL 生成 iOS 证书,制作 p12 与描述文件,KXBuild 签名实操

iOS App 装到手机和上架都要签名,签名需要证书(.p12)和描述文件(.mobileprovision)。Apple 官方的申请流程要在 Mac 的「钥匙串访问」里生成 CSR,本文用 OpenSSL 在 Windows 上完成同样的事,同时也可以使用 Appuploader 来生成证书签名描述文件。从生成私钥一直做到 KXBuild 能用这些文件签名。需要准备已加入 Apple Developer Program 的账号、一台 iPhone 和数据线,整个过程大约二十分钟。

KXBuild 不会替你在 Apple 后台创建证书,它只读取你放进证书目录的文件。除了本文的 OpenSSL 做法,也可以用 Appuploader 这类工具登录开发者账号直接生成,见证书与签名。

先分清要申请哪些 {#which-certs}

证书 什么时候用 配合的描述文件
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}

CSR(证书签名请求)包含你的公钥,交给 Apple 签发证书;对应的私钥留在本机,之后合成 .p12 要用。

Windows 没有自带 OpenSSL,装了 Git for Windows 的已经有一份,位置是 C:\Program Files\Git\mingw64\bin\openssl.exe。下面的命令在 PowerShell 中执行,先把它存进一个变量。没有装 Git 的,也可以用 winget 或其他渠道安装 OpenSSL,把 & $openssl 换成 openssl 即可。

powershell 复制代码
$openssl = "C:\Program Files\Git\mingw64\bin\openssl.exe"
mkdir D:\ios-cert; cd D:\ios-cert
& $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 下载证书 {#download-cer}

  1. 登录 developer.apple.com,进入 Certificates, Identifiers & Profiles,打开 Certificates 页,点加号。
  2. 选择 Apple Development(发布证书选 Apple Distribution),点 Continue。
  3. 上传 ios.csr,点 Continue。
  4. 点 Download,得到 development.cer(发布证书下载后通常叫 distribution.cer)。

下载的 .cer 是 DER 格式,只含证书,不含私钥,单独拿它不能签名。

合成 p12 {#make-p12}

先把 .cer 转成 PEM 格式,再和私钥合成 .p12。第二条命令会让你输入两次导出密码,这个密码之后要写进 password.properties。

powershell 复制代码
& $openssl x509 -in development.cer -inform DER -out development.pem
& $openssl pkcs12 -export -inkey ios.key -in development.pem -out development.p12

Git for Windows 自带的是 OpenSSL 3,默认用 AES-256 加密 .p12,KXBuild 可以直接读取。同一个文件还要导入 Mac 的钥匙串或其他较老的签名工具时,它们可能报密码错误,这时加上 -legacy 重新导出一份兼容格式。

powershell 复制代码
& $openssl pkcs12 -export -legacy -inkey ios.key -in development.pem -out development.p12

可以用下面的命令确认 .p12 里同时有证书和私钥,输出中能看到 Certificate bag 和 Shrouded Keybag 两行即可。

powershell 复制代码
& $openssl pkcs12 -in development.p12 -info -noout

注册 App ID {#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 查看。

添加测试设备 {#devices}

Development 和 Ad Hoc 描述文件只允许安装到注册过的设备,先拿到手机的 UDID。

用数据线把 iPhone 连到电脑,解锁并点「信任此电脑」,然后运行下面的命令,第一列就是 UDID。第一次连接要装设备驱动,按设备准备操作。

powershell 复制代码
kxdevice device list

装了 iTunes 的也可以在设备摘要页点击「序列号」一栏,切换出 UDID;第三方设备管理工具的设备信息页一般也能直接复制。

在 Devices 页点加号,Platform 选 iOS,填设备名和 UDID,点 Continue 保存。每类设备每个会员年度最多注册 100 台,删掉的设备在本年度内仍然计数,不要随手注册。

生成描述文件 {#profile}

  1. 在 Profiles 页点加号。开发选 iOS App Development;上架选 App Store Connect;发给测试人员直接安装选 Ad Hoc。
  2. 选择上一步的 App ID。
  3. 勾选要允许的证书。Development 描述文件可以同时勾选团队所有人的开发证书,一份文件大家共用。
  4. Development 和 Ad Hoc 类型勾选要安装的设备。App Store Connect 类型没有这一步。
  5. 起一个好认的名字,如 MyApp_Dev,点 Generate,然后 Download 得到 MyApp_Dev.mobileprovision。

描述文件在生成的那一刻就把证书、设备和能力固定下来。之后新增设备、给 App ID 开通新能力、换了证书,都要回到 Profiles 页编辑这份描述文件,保存并重新下载,否则构建或安装会报错,具体报错和处理见iOS 签名报错与 ipa 安装失败的解决办法。

放进 KXBuild 的证书目录 {#keychain}

证书目录有两个位置,工程根目录下的 keychain 只对该工程生效,KXBUILD_HOME 下的 keychain 所有工程共用,Windows 上默认是 %USERPROFILE%\kxbuild\keychain。把 .p12 和 .mobileprovision 放进去,并在同目录新建 password.properties,每行写一张证书的「文件名=密码」。

text 复制代码
keychain\
├─ development.p12
├─ MyApp_Dev.mobileprovision
└─ password.properties
text 复制代码
development.p12=你导出时设的密码

文件名要和 .p12 完全一致,区分大小写,密码不加引号。放好之后构建时按工程中的签名设置自动选择证书和描述文件,不需要在 KXBuild 里另外配置,规则见证书与签名。

最后连上手机构建并安装一次,能在手机上打开 App 就说明证书、描述文件和设备都对上了。

powershell 复制代码
kxbuild build .\MyApp.xcodeproj --install

ios.key、ios.csr、.cer、.pem 这些中间文件不需要放进证书目录。

证书到期、续期和备份 {#renew}

到期前 Apple 会发邮件提醒。开发证书到期后,用它签名的开发版 App 装不上也打不开,重新构建即可;发布证书到期不影响已经在 App Store 上架的版本,但 Ad Hoc 包会失效,也不能再用它上传新构建。

续期 证书不能延长,只能申请一张新的。按本文步骤重新生成 CSR 上传即可,也可以沿用原来的 ios.key 再生成一份 CSR,省去管理新私钥。拿到新证书后合成新的 .p12,再到 Profiles 页编辑所有用到旧证书的描述文件,改选新证书,保存并重新下载,替换证书目录里的旧文件。

备份 把 ios.key 和合成好的 .p12 连同密码存进密码管理器或加密的团队共享盘,不要提交进代码仓库。换电脑、给构建服务器配证书时,直接复制 .p12 和 password.properties 即可,不用重新申请。

私钥丢了 在 Certificates 页吊销这张证书,重新走一遍申请流程。吊销发布证书前先和团队确认没有人正在用它出包。

更多相关问题可以去官网查看:https://www.kxbuild.net/zh

相关推荐
椒颜皮皮虾྅3 小时前
模型部署不再卡在环境上:DeploySharp 四大推理引擎与 Windows/Linux 离线交付实战
linux·运维·开发语言·人工智能·windows·计算机视觉·cuda
最强小杰3 小时前
gpt-image-2.5-sunburst + OpenAI SDK + Cline 怎么接?完整图生图与局部重绘教程
gpt·ios·ai·iphone
我要见SA姐13 小时前
Chrome 内存泄漏诊断指南:从现象定位到根因排查
ide·vscode·python·自动化·编辑器
昂好的day3 小时前
C# 同步异步与多线程:Thread / Task / 线程池一次讲透(上篇)
开发语言·windows·c#
垆边人似月.3 小时前
Ubuntu 配置 Samba 共享文件夹并映射到 Windows 完整指南
linux·windows·ubuntu
kk_net88993 小时前
FSNotes:macOS 和 iOS 上的开源笔记管理器
笔记·其他·macos·ios
00后程序员张4 小时前
Windows 开发 iOS App 入门,用 SwiftUI 写第一个 iOS App 装到 iPhone
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
2501_9151063213 小时前
抓包抓到乱码或压缩字节怎么解析,TraceEagle五种查看模式和一键解码
网络协议·计算机网络·网络安全·ios·adb·https·udp
BIBI204915 小时前
换 Git 托管平台怎么做?基于 TortoiseGit 的跨平台迁移教程
windows·git·tortoisegit·问题解决·版本控制·最佳实践