iOS 协同设计 CI:errSecInternalComponent

问题描述 投票:0回答:1

目标

嗨。我正在尝试使用新的证书/密钥更新我的 iOS CI,因为应用程序所有者已更改,我们必须开始使用新的 Apple 帐户的凭据进行签名。 在该过程按预期工作之前。然而,现在它因不明原因而失败了。

我做什么

这部分与之前的流程相比几乎没有变化。只有 .key 和 .cer 发生了变化

准备工作

  • 使用 openssl cli 生成新密钥和 CSR
  • 将 CSR 提交给 Apple 并获得签名
  • 下载已签名的证书
  • 下载Apple CA证书
  • 创建一个新的钥匙串
  • 进入钥匙串导入:
    • 苹果CA证书
    • 我的应用程序证书(由 Apple CA 签名)
    • 我的私钥
  • 创建 Apple 分发配置文件(也尝试使用 iOS 分发),将其链接到证书
  • 下载配置文件
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 也链接到它。

enter image description here

运行CI

在 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
打开钥匙串进行检查))

ios xcode macos code-signing
1个回答
0
投票

我可能已经弄清楚了这一点。 我缺少

-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
© www.soinside.com 2019 - 2024. All rights reserved.