Macos OS X上的Jenkins:xcodebuild给出代码符号错误
总结: 使用最新的安装程序()在OS X上设置Jenkins变得非常容易,但是管理代码签名过程仍然非常困难,没有直接的答案 动机: 运行遵循在OS X()上运行服务的常见最佳实践的无头CI服务器 背景:Macos OS X上的Jenkins:xcodebuild给出代码符号错误,macos,jenkins,Macos,Jenkins,总结: 使用最新的安装程序()在OS X上设置Jenkins变得非常容易,但是管理代码签名过程仍然非常困难,没有直接的答案 动机: 运行遵循在OS X()上运行服务的常见最佳实践的无头CI服务器 背景: 2009年10月12日- 2011年6月15日- 2011年6月23日- 2011年7月26日- 2011年8月30日- 2011年9月20日- 2011年9月14日- 2011年11月12日- 2012年1月23日- 2012年3月7日- 过程: 通过OS X安装Jenkins CI。对于
- 2009年10月12日-
- 2011年6月15日-
- 2011年6月23日-
- 2011年7月26日-
- 2011年8月30日-
- 2011年9月20日-
- 2011年9月14日-
- 2011年11月12日-
- 2012年1月23日-
- 2012年3月7日-
xcodebuild-target-MyTarget-sdk iphoneos
的自由风格项目应该可以工作。正如本文标题所示,它不符合以下要求:
代码签名错误:身份“iPhone开发者”与默认密钥链中的任何有效证书/私钥对都不匹配
很明显,需要发生什么-您需要将有效的代码签名证书和私钥添加到默认密钥链中。在研究如何做到这一点的过程中,我没有找到一个解决方案不会使系统暴露出某种程度的漏洞
问题1:jenkins守护程序没有默认的密钥链
sudo-u jenkins安全默认钥匙链
…产生“找不到默认密钥链”
正如下面所指出的,默认情况下,jenkins守护进程的UserShell设置为/usr/bin/false(我认为这是一个特性,而不是bug);按照他的答案将UserShell更改为bash。然后,您可以使用sudo su jenkins
以jenkins用户身份登录并获得bash提示
sudo su jenkins
cd~/Library
mkdir钥匙链
cd钥匙链
security创建钥匙链。钥匙链
安全默认密钥链-s.keychain
安全列表keychains
,您会看到唯一可用的keychain是系统keychain;我想这就是大多数人想到把他们的证书和钥匙放在里面的地方。但是,这似乎是一个非常糟糕的主意——尤其是考虑到这一点
问题2:添加代码签名证书和私钥
这就是我真正开始感到恶心的地方。我有一种直觉,我应该创建一个新的公钥/私钥,专门用于Jenkins。我的想法是,如果jenkins守护进程遭到破坏,那么我可以轻松地在Apple的Provisioning Portal中撤销证书,并生成另一个公钥/私钥。如果我对我的用户帐户和Jenkins使用相同的密钥和证书,那么如果Jenkins服务受到攻击,就意味着更麻烦(损坏?)
指向将使用纯文本密码从脚本解锁钥匙链。在jenkins守护进程的密钥链中保留“一次性”证书和密钥之外的任何东西似乎都是不负责任的
+ security list-keychains
"/Library/Keychains/System.keychain"
"/Library/Keychains/System.keychain"
我对任何相反的讨论都很感兴趣。我是否过于谨慎?
为了在终端中创建一个新的CSR作为jenkins守护进程,我执行了以下操作
sudo su jenkins
certtool r CertificateSigningRequest.certSigningRequest
系统会提示您输入以下内容(其中大部分我都是根据知识猜测正确答案的;您是否有更好的洞察力?请分享)。。。
- 输入密钥和证书标签:
- 选择算法:
(适用于RSA)r
- 以位输入密钥大小:
2048
- 选择签名算法:
(适用于MD5)5
- 输入质询字符串:
- 然后是一堆关于RDN的问题
安全解锁钥匙链
security add certificate ios\u development.cer
sudo su jenkins
mkdir~/Library/MobileDevice
mkdir~/Library/MobileDevice/Provisioning\Profiles
安全解锁钥匙链-p
xcodebuild-target-MyTarget-sdk iphoneos
security unlock-keychain -p mySecretPassword...
<target name="unlock_keychain">
<exec executable="security">
<arg value="-v"/>
<arg value="unlock-keychain"/>
<arg value="-p"/>
<arg value="<My Password>"/>
<arg value="/Users/macbuild/Library/Keychains/login.keychain"/>
</exec>
</target>
+ security list-keychains
"/Library/Keychains/System.keychain"
"/Library/Keychains/System.keychain"
sudo dscl . -change /Users/jenkins UserShell /usr/bin/false /bin/bash
$ security import devcertificate.cer -k jenkins.keychain -A
$ security import AppleWWDRCA.cer -k jenkins.keychain -A
$ security unlock-keychain -p YourKeychainPass jenkins.keychain
$ security import devprivatekey.p12 -k login.keychain -P ThePasswordYouSetWhenExporting -A