使用 launchd runner 导出期间 Codesign 失败
Codesign fails during export using a launchd runner
当使用 fastlane 构建和导出应用程序时,我们所有的构建机器在导出过程中都开始失败 codesign
。唯一发生变化的是 fastlane 重新生成的与 TestFlight 部署相关的证书最近到期。
生成器 运行 作为启动 gitlab-runner
的 launchd
服务。
我已经从钥匙串中清除了所有过期的证书和无效的配置文件,并验证了每个证书链中是否存在完整的证书链。
我写了一个问题的精简示例,一个简单的脚本 runner.sh
来说明问题并假装是 CI 运行ner:
runner.sh
# Prepare to codesign
security unlock-keychain CodeSigning.keychain
# Codesign
/usr/bin/codesign -vvv --force --sign <HASH> ./MySDK.framework
当 运行 从 shell 导出时成功,但是当 运行 从启动导出时失败。线索:
Warning: unable to build chain to self-signed root for signer
和errSecInternalComponent
然而,这非常有效,直到最近才有效。 Apple 是否打破了 launchd 的钥匙串?
/Library/LaunchDaemons/com.example.runner.plist
<key>Label</key>
<string>com.example.runner</string>
<key>SessionCreate</key><true/>
<key>RunAtLoad</key><true/>
<key>UserName</key>
<string>builder</string>
<key>GroupName</key>
<string>staff</string>
<key>StandardOutPath</key>
<string>/tmp/test.stdout</string>
<key>StandardErrorPath</key>
<string>/tmp/test.stderr</string>
<key>ProgramArguments</key>
<array>
<string>./runner.sh</string>
</array>
<key>WorkingDirectory</key>
<string>/Users/builder/path/to/runner</string>
WWDR 中间体必须在 System.keychain?!
经过 3 周的钥匙串摆弄,重写我们的代码设计脚本以直接调用 Security.framework CoreFoundtion APIs,验证钥匙串转储以获取正确的受信任应用程序和分区列表设置并进行无数次测试其他理论,就是这么简单,除了 System.keychain
之外,您不能再在任何钥匙串中使用 WWDR 中间体。一旦安装在那里,它就会神奇地工作。
下载所有全球开发者关系证书
https://www.apple.com/certificateauthority/
这是 Apple 在较新版本的钥匙串搜索机制中所做的更改,可能与 Security.framework.
中自定义钥匙串 API 的弃用有关
钥匙串服务API文档
只需查看所有已弃用的 API。这有效地消除了自定义钥匙串。
https://developer.apple.com/documentation/security/keychain_services/keychains?language=objc
安装
除了解决方案之外,下一个难题是将这些证书放入 System.keychain
。 Apple 竭尽全力让远程管理数十台机器变得尽可能痛苦。
sudo security import ../WWDRIntermediates.p7b -k /Library/Keychains/System.keychain
我将所有 WWDR 证书下载到 .p7b
并导入它们。
它对我有用。我一个一个添加苹果根证书:
sudo security import AppleWWDRCA.cer -k /Library/Keychains/System.keychain
sudo security import AppleWWDRCAG2.cer -k /Library/Keychains/System.keychain
sudo security import AppleWWDRCAG3.cer -k /Library/Keychains/System.keychain
sudo security import AppleWWDRCAG5.cer -k /Library/Keychains/System.keychain
sudo security import AppleWWDRCAG6.cer -k /Library/Keychains/System.keychain
当使用 fastlane 构建和导出应用程序时,我们所有的构建机器在导出过程中都开始失败 codesign
。唯一发生变化的是 fastlane 重新生成的与 TestFlight 部署相关的证书最近到期。
生成器 运行 作为启动 gitlab-runner
的 launchd
服务。
我已经从钥匙串中清除了所有过期的证书和无效的配置文件,并验证了每个证书链中是否存在完整的证书链。
我写了一个问题的精简示例,一个简单的脚本 runner.sh
来说明问题并假装是 CI 运行ner:
runner.sh
# Prepare to codesign
security unlock-keychain CodeSigning.keychain
# Codesign
/usr/bin/codesign -vvv --force --sign <HASH> ./MySDK.framework
当 运行 从 shell 导出时成功,但是当 运行 从启动导出时失败。线索:
Warning: unable to build chain to self-signed root for signer
和errSecInternalComponent
然而,这非常有效,直到最近才有效。 Apple 是否打破了 launchd 的钥匙串?
/Library/LaunchDaemons/com.example.runner.plist
<key>Label</key>
<string>com.example.runner</string>
<key>SessionCreate</key><true/>
<key>RunAtLoad</key><true/>
<key>UserName</key>
<string>builder</string>
<key>GroupName</key>
<string>staff</string>
<key>StandardOutPath</key>
<string>/tmp/test.stdout</string>
<key>StandardErrorPath</key>
<string>/tmp/test.stderr</string>
<key>ProgramArguments</key>
<array>
<string>./runner.sh</string>
</array>
<key>WorkingDirectory</key>
<string>/Users/builder/path/to/runner</string>
WWDR 中间体必须在 System.keychain?!
经过 3 周的钥匙串摆弄,重写我们的代码设计脚本以直接调用 Security.framework CoreFoundtion APIs,验证钥匙串转储以获取正确的受信任应用程序和分区列表设置并进行无数次测试其他理论,就是这么简单,除了 System.keychain
之外,您不能再在任何钥匙串中使用 WWDR 中间体。一旦安装在那里,它就会神奇地工作。
下载所有全球开发者关系证书
https://www.apple.com/certificateauthority/
这是 Apple 在较新版本的钥匙串搜索机制中所做的更改,可能与 Security.framework.
中自定义钥匙串 API 的弃用有关钥匙串服务API文档
只需查看所有已弃用的 API。这有效地消除了自定义钥匙串。
https://developer.apple.com/documentation/security/keychain_services/keychains?language=objc
安装
除了解决方案之外,下一个难题是将这些证书放入 System.keychain
。 Apple 竭尽全力让远程管理数十台机器变得尽可能痛苦。
sudo security import ../WWDRIntermediates.p7b -k /Library/Keychains/System.keychain
我将所有 WWDR 证书下载到 .p7b
并导入它们。
它对我有用。我一个一个添加苹果根证书:
sudo security import AppleWWDRCA.cer -k /Library/Keychains/System.keychain
sudo security import AppleWWDRCAG2.cer -k /Library/Keychains/System.keychain
sudo security import AppleWWDRCAG3.cer -k /Library/Keychains/System.keychain
sudo security import AppleWWDRCAG5.cer -k /Library/Keychains/System.keychain
sudo security import AppleWWDRCAG6.cer -k /Library/Keychains/System.keychain