嗨。我正在尝试使用新的证书/密钥更新我的 iOS CI,因为应用程序所有者已更改,我们必须开始使用新的 Apple 帐户的凭据进行签名。 在该过程按预期工作之前。然而,现在它因不明原因而失败了。
这部分与之前的流程相比几乎没有变化。只有 .key 和 .cer 发生了变化
openssl req -new -key ios_key.key -out ios_csr.csr
openssl req -new -key ios_key.key -out csr.certSigningRequest -subj "/[email protected], CN=Fancy Client, C=US"
## upload csr.certSigningRequest to Apple
## download the signed .cer
## link that .cer to profile
openssl pkcs12 -export -legacy -in ios_signed.cer -inkey ios_key.key -passout pass:pass1 -out fancy-client-ci.p12 -name FancyClient
security create-keychain -p pass1 ci.keychain
security import fancy-client-ci.p12 -A -P pass1 -k /Users/ec2-user/Library/Keychains/ci.keychain-db
wget https://www.apple.com/certificateauthority/AppleWWDRCAG3.cer
security import AppleWWDRCAG3.cer -A -P pass1 -k /Users/ec2-user/Library/Keychains/ci.keychain-db
当我使用 MacOS 的 KeychainAccess 打开 ci.keychain 时,签名的证书显示为可信(信任链完整),并且 PrivKey 也链接到它。
在 CI 运行期间,我将钥匙串和配置文件转储到文件系统,解锁钥匙串并将配置文件文件的路径提供给 fastlane 的
update_project_provisioning
,然后我使用 build_app
函数发出通道。
代码构建得很好,没有任何问题。就像更改证书之前一样。但到了签名的时候,却失败了
/usr/bin/codesign --force --sign B4C...411 --generate-entitlement-der /Users/ec2-user/Library/Developer/Xcode/DerivedData/<HIDDEN>-<HIDDEN>/Build/Intermediates.noindex/ArchiveIntermediates/production/IntermediateBuildFilesPath/UninstalledProducts/iphoneos/
nanopb.framework
note: Signing static framework with --generate-pre-encrypt-hashes (in target 'nanopb' from project 'Pods')
/Users/ec2-user/Library/Developer/Xcode/DerivedData/<HIDDEN>-<HIDDEN>/Build/Intermediates.noindex/ArchiveIntermediates/production/IntermediateBuildFilesPath/UninstalledProducts/iphoneos/nanopb.framework: errSecInternalComponent
Command CodeSign failed with a nonzero exit code
如果我通过 ssh 连接到 CI MAC 服务器并尝试自己手动运行该签名命令,我会得到完全相同的错误。即使我将密钥和证书添加到登录钥匙串中,这些都通过
security list-keychains
列出。 现在问题来了:如果我通过 GUI(通过 VPN 连接)在 MAC 终端中运行完全相同的命令,它就会成功。
如果我在 CI、ssh 或 GUI 中运行
security find-identity -p codesigning
,我会得到输出中列出的相同身份。
什么给...?我不是一个熟练的 MAC 用户;我是否遗漏了钥匙扣工作原理的一些细微差别?
编辑 如果我允许它使用“登录”钥匙串,它甚至可以通过 ssh 构建良好(我也在那里添加了签名证书+密钥)。 CI 运行程序在 Mac 服务器启动后通过 ssh 在 tmux 会话中启动
tmux new-session -d -s bb-runners;
tmux split-window -t bb-runners -h;
tmux send-keys -t bb-runners:0.0 'cd ${DIR_RUNNER_0} && ./run-0.bash' C-m;
tmux send-keys -t bb-runners:0.1 'cd ${DIR_RUNNER_1} && ./run-1.bash' C-m;
编辑: 我的另一个观察结果是,如果我复制登录钥匙串文件,刷新其内容并添加签名所需的 3 个工件(2 个证书 1 个密钥),则协同设计有效。如果我比较工作和非工作 KC 的大小,它们分别是 29648 和 29636。我比较了分区,目前,它们是相同的(plist 中只有 apple:(通过使用
less
打开钥匙串进行检查))
我可能已经弄清楚了这一点。 我缺少
-T "" -T /usr/bin/codesign
命令中的 security import
。
这个算法似乎有效:
KC_FILE="${PWD}/ci.keychain-db"
KC_PASS="pass1"
CER_CN="Fancy Client"
CER_EMAIL="[email protected]"
CER_C="US"
openssl req -new -key ios_key.key -out ios_csr.csr
openssl req -new -key ios_key.key -out csr.certSigningRequest -subj "/emailAddress=${CER_EMAIL}, CN=${CER_CN}, C=${CER_C:?US}"
## upload csr.certSigningRequest to Apple
## download the signed .cer
## link that .cer to profile
openssl pkcs12 -export -legacy -in ios_signed.cer -inkey ios_key.key -passout pass:"${KC_PASS}" -out fancy-client-ci.p12 -name "${CER_CN}"
security create-keychain -p "${KC_PASS}" "${KC_FILE}"
security import fancy-client-ci.p12 -A -P "${KC_PASS}" -k "${KC_FILE}" -T "" -T /usr/bin/codesign
security set-key-partition-list -S apple: -k "${KC_PASS}" "${KC_FILE}"
wget https://www.apple.com/certificateauthority/AppleWWDRCAG3.cer
security import AppleWWDRCAG3.cer -A -P "${KC_PASS}" -k "${KC_FILE}" -T "" -T /usr/bin/codesign