web-dev-qa-db-ja.com

OS XのJenkins:xcodebuildはコード署名エラーを出します

概要:

OS XでのJenkinsのセットアップは、最新のインストーラーで大幅に簡単になりました( 現在1.449-2012年3月9日 )。

動機:

OS Xでサービスを実行するための一般的なベストプラクティスに従うヘッドレスCIサーバーを実行します( その一部はここでは平易な言語で説明されています )。

背景:

プロセス:

OS X経由でJenkins CIをインストールします インストーラーパッケージ 。 「インストールの種類」の手順では、「カスタマイズ」ボタンをクリックして、「起動時に「jenkins」として起動」を選択します。

ディスカッション:

この時点での単純な期待は、ビルドスクリプトxcodebuild -target MyTarget -sdk iphoneosを使用したフリースタイルプロジェクトが機能することでした。この投稿のタイトルで示されているように、次のように失敗し、失敗します。

Code Sign error: The identity 'iPhone Developer' doesn't match any valid certificate/private key pair in the default keychain

何が起こる必要があるかは十分明らかです。有効なコード署名証明書と秘密鍵をデフォルトのキーチェーンに追加する必要があります。これを達成する方法を研究する中で、システムをある程度の脆弱性にさらさない解決策は見つかりませんでした。

問題1:jenkinsデーモンのデフォルトキーチェーンがありません

Sudo -u jenkins security default-keychain ... yields "デフォルトのキーチェーンが見つかりませんでした"

以下で Ivo Dancet で指摘されているように、UserShellはデフォルトでjenkinsデーモンの/ usr/bin/falseに設定されます(これはバグではなく機能だと思います)。彼の答えに従ってUserShellをbashに変更します。次に、Sudo su jenkinsを使用して、jenkinsユーザーとしてログインし、bashプロンプトを取得できます。

  1. Sudo su jenkins
  2. cd ~/Library
  3. mkdir Keychains
  4. cd Keychains
  5. security create-keychain <keychain-name>.keychain
  6. security default-keychain -s <keychain-name>.keychain

いいですねデフォルトのキーチェーンが用意されました。右に移動しましょうか?しかし、最初に、なぜデフォルトのキーチェーンを作成する必要があるのでしょうか?

私が調査を通じて読んだほぼすべての回答、提案、または会話は、コード署名証明書とキーをシステムのキーチェーンにチャックするだけでよいことを示唆しています。 Jenkinsでsecurity list-keychainsをフリースタイルプロジェクトとして実行すると、利用可能なキーチェーンはシステムキーチェーンのみであることがわかります。ほとんどの人が証明書とキーをそこに入れるというアイデアを思いついたのはそこだと思います。しかし、これは非常に悪い考えのように思えます-特に キーチェーンを開くにはパスワード付きのプレーンテキストスクリプトを作成する必要があります

問題2:コード署名証明書と秘密キーを追加する

これは私が本当にきしむようになるところです。私は、ジェンキンスで使用するためのユニークな新しい公開/秘密キーを作成する必要があると感じています。私の思考プロセスは、jenkinsデーモンが侵害された場合、Appleのプロビジョニングポータルで証明書を簡単に失効させ、別の公開/秘密キーを生成できることです。ユーザーアカウントとJenkinsに同じキーと証明書を使用する場合、jenkinsサービスが攻撃されると、さらに面倒(損傷?)になります。

Simon Urbanek's answer を指すと、プレーンテキストパスワードでスクリプトからキーチェーンのロックが解除されます。 jenkinsデーモンのキーチェーンに「使い捨て」の証明書とキー以外を保持するのは無責任なようです。

反対の議論に非常に興味があります。私は過度に慎重ですか?

ターミナルでジェンキンスデーモンとして新しいCSRを作成するために、私は次のことをしました...

  1. Sudo su jenkins
  2. certtool r CertificateSigningRequest.certSigningRequest次のプロンプトが表示されます(これらのほとんどは、正しい答えで教育的な推測を行いました。より良い洞察がありますか?共有してください。)...
    • キーと証明書ラベルを​​入力します。
    • アルゴリズムの選択:r(RSAの場合)
    • キーサイズをビットで入力:2048
    • 署名アルゴリズムを選択:5(MD5の場合)
    • チャレンジ文字列を入力してください:
    • 次に、RDNに関する一連の質問
  3. 生成されたCSRファイル(CertificateSigningRequest.certSigningRequest)をAppleのプロビジョニングポータルに新しいApple ID
  4. リクエストを承認し、.cerファイルをダウンロードします
  5. security unlock-keychain
  6. security add-certificate ios_development.cer

これにより、一歩近づきます...

問題3:プロビジョニングプロファイルとキーチェーンのロック解除

CIで使用するためだけに、Provisioning Portalで特別なプロビジョニングプロファイルを作成しました。何か悪いことが起こった場合、その影響をもう少し小さくしたいと考えています。ベストプラクティスまたは過度に慎重ですか?

  1. Sudo su jenkins
  2. mkdir ~/Library/MobileDevice
  3. mkdir ~/Library/MobileDevice/Provisioning\ Profiles
  4. プロビジョニングポータルでセットアップしたプロビジョニングプロファイルをこの新しいフォルダーに移動します。 jenkinsとしてコマンドラインからxcodebuildを実行できるようになるまでに2つの短いステップがあります。したがって、ビルドを実行しているJenkins CIを取得できるようになりました。
  5. security unlock-keychain -p <keychain password>
  6. xcodebuild -target MyTarget -sdk iphoneos

これで、jenkinsデーモンとしてログインしたときにコマンドラインからビルドが成功するので、フリースタイルのプロジェクトを作成し、最後の2つのステップ(上記の#5と#6)を追加すると、ビルドを自動化できますiOSプロジェクト!

必要ではないかもしれませんが、このセットアップをすべて成功させた後、jenkins UserShellを/ usr/bin/falseに戻す方が良いと感じました。私は妄想的ですか?

問題4:デフォルトのキーチェーンはまだ使用できません!

編集:質問に編集内容を投稿し、ソリューションが100%であることを確認するために再起動しました。もちろん、手順を省略しました

上記のすべての手順を実行した後でも、 この回答 に記載されているように、/ Library/LaunchDaemons/org.jenkins-ci.plistのLaunch Daemon plistを変更する必要があります。これも openrdarバグ であることに注意してください。

次のようになります。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.Apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>EnvironmentVariables</key>
        <dict>
                <key>JENKINS_HOME</key>
                <string>/Users/Shared/Jenkins/Home</string>
        </dict>
        <key>GroupName</key>
        <string>daemon</string>
        <key>KeepAlive</key>
        <true/>
        <key>Label</key>
        <string>org.jenkins-ci</string>
        <key>ProgramArguments</key>
        <array>
                <string>/bin/bash</string>
                <string>/Library/Application Support/Jenkins/jenkins-runner.sh</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>UserName</key>
        <string>jenkins</string>
        <!-- **NEW STUFF** -->
        <key>SessionCreate</key>
        <true />
</dict>
</plist>

このセットアップでは、 JenkinsのXcodeプラグイン もお勧めします。これにより、xcodebuildスクリプトのセットアップが少し簡単になります。この時点で、xcodebuildのmanページを読むこともお勧めします-ターミナルでここまでやってくれたのですか?

このセットアップは完璧ではなく、アドバイスや洞察は大歓迎です。

私が問題を解決するために使用するようになったのは、ほぼ全員の入力のコレクションだったので、「正しい」答えを選択するのに苦労しました。私は少なくとも全員に賛成票を投じようとしましたが、サイモンが元の質問にほとんど答えたので、サイモンに答えを授与しました。さらに、 SamiTikka は、JenkinsをAppleScriptを使用して単純なol 'OS Xアプリとして動作させるための努力に多大な功績があります。 Jenkinsを立ち上げて、ユーザーセッション内で素早く動作することにのみ関心がある場合(つまり、ヘッドレスサーバーとしてではない場合)、彼のソリューションははるかにMacに似ています。

私の努力sparkさらなる議論、そして彼らがiOSプロジェクトのためにJenkins CIを週末に彼らが持っているすべての素晴らしいことのためにセットアップすることができると考えて来る次の貧しい人々を助けることを願っていますそれについて聞いた。


更新:2013年8月9日

非常に多くの賛成票とお気に入りがあるので、18か月後にこの簡単な教訓を学びに戻ってくると思いました。

レッスン1:Jenkinsを公開インターネットに公開しない

2012年のWWDCで、XcodeとOS X Serverのエンジニアにこの質問をしました。私は「それをしないでください!」という不協和音を受け取りました。私が尋ねた人から。彼らは全員、自動化されたビルドプロセスは素晴らしいことですが、サーバーにはローカルネットワークでのみアクセスできるようにすることに同意しました。 OS X Serverのエンジニアは、VPN経由のリモートアクセスを許可することを提案しました。

レッスン2:新しいインストールオプションがあります

先日、CocoaHeadsでJenkinsの体験について話しましたが、驚いたことに、Homebrewと Bitnami Mac App Store バージョンという新しいインストール方法が見つかりました。これらは間違いなくチェックする価値があります。 Jonathan Wright には要点を詳述する要点があります Homebrew Jenkinsが働いています

レッスン3:いいえ、真剣に、ビルドボックスをインターネットに公開しないでください

元の投稿から、私がシステム管理者でもセキュリティの専門家でもないことは明らかです。プライベートなもの(キーチェーン、クレデンシャル、証明書など)についての常識は、私がJenkinsボックスをインターネットに置くことにかなり不安を感じさせました。 Nick Arnott Neglected Potentialは、 この記事 で私のヒッピージービーを簡単に確認できました。

TL; DR

ビルドプロセスの自動化を検討している他の人への私の推奨は、この1年半で変わりました。 Jenkinsマシンがファイアウォールの内側にあることを確認してください。インストーラー、Bitnami Mac App Storeバージョン、Sami TikkaのAppleScriptなどを使用して、Jenkinsを専用のJenkinsユーザーとしてインストールおよび設定します。これにより、上記で説明した頭痛のほとんどが解決されます。リモートアクセスが必要な場合、OS X ServerでVPNサービスを設定するには10分かかります。私はこのセットアップを1年以上使用していますが、非常に満足しています。幸運を!

107
edelaney05

キーチェーンを使用するには、ロックを解除する必要があります。 security unlock-keychainを使用してロックを解除できます。インタラクティブに(安全)またはコマンドラインでパスワードを指定する(安全でない)ことができます。例:

security unlock-keychain -p mySecretPassword...

明らかに、これをスクリプトに組み込むと、そのキーチェーンのセキュリティが低下するため、多くの場合、このような損傷を最小限に抑えるために署名資格情報のみで個別のキーチェーンを設定します。

通常、Terminalでは、デフォルトのキーチェーンはログイン時にロック解除されるため、キーチェーンはセッションによって既にロック解除されています。そのため、これを行う必要はありません。ただし、セッションで実行されないプロセスは、ユーザーとしてユーザーがいる場合でも、キーチェーンのロックが解除されません(ほとんどの場合、これはsshに影響しますが、他のプロセスにも影響します)。

30
Simon Urbanek

また、Jenkinsを介してアドホック配布を行いたい場合、プロビジョニングプロファイルに加えて、Jenkinsが配布証明書とチーム管理者IDにアクセスする必要があります。

.cerファイルでエクスポートされたIDを使用して、プログラムでインポートできます。-Aスイッチは、すべてのプログラムがこのエントリにアクセスできるようにします。または、いくつかの-T /path/to/programスイッチを使用して、codesignおよびxcodebuildアクセスを許可することもできます。

$ security import devcertificate.cer -k jenkins.keychain -A

もちろん、Apple WWDCRA証明書もほぼ同じ方法でインポートされている必要があります。

$ security import AppleWWDRCA.cer -k jenkins.keychain -A

ただし、devcertificate.cerの秘密鍵も必要です。これを行うには、対応する秘密キーを.p12キーとしてエクスポートし、パスワードを設定する必要があります。 Jenkins Shellからアクセスできる場所に置き、キーチェーンのロックを解除してインポートします。

$ security unlock-keychain -p YourKeychainPass jenkins.keychain
$ security import devprivatekey.p12 -k login.keychain -P ThePasswordYouSetWhenExporting -A

配布証明書のインポートも同じように機能します。 .cerではなく.p12をインポートするためにキーチェーンのロックを解除する必要がある理由がわかりません。

また、プロビジョニングプロファイルへのアクセスも必要になります。これらの手順をこの投稿で編集します。

12
Zsub

私は同じ問題を抱えていて、答えを探していました。ここで私が学んだことの1つがあります。

私はjenkinsユーザー、インストーラーによって作成されたユーザーとしてjenkinsを実行しています。他の誰もが言ったように、彼はあなたの通常のユーザーと同じキーチェーンにアクセスできません。 jenkinsユーザーとしてログインしようとする代わりに、jenkinsユーザーとしてテストしたいコマンドを実行する「シェルの実行」という1つのビルドステップのみを含む2番目のビルドプロジェクトを作成しました。

設定が完了したら、コマンドを実行できます

security list-keychains

そして、これはジェンキンスが見ることができる唯一のものがシステムキーチェーンであることを私に明らかにしました。

+ security list-keychains
    "/Library/Keychains/System.keychain"
    "/Library/Keychains/System.keychain"

その後、キーチェーンアクセスアプリを開き、「iPhone Developer:xxxx」証明書をシステムキーチェーンにコピーしました(右クリックして、「ログイン」キーチェーンからコピーします)。

これにより、証明書/秘密キーペアのコード署名エラーに合格しましたが、プロビジョニングプロファイルで別のエラーを開きました(同様の、しかし異なる問題のようです)。

5
brianestey

パスワードを変更するには、Sudo passwd jenkins <new-pw>を使用できます。ただし、dsclコマンドを使用してパスワードを変更する方が良いと思います。

私のインストールでは、jenkins(公式インストーラー)にはユーザーShell/usr/bin/falseがありました。 bashに変更することで、ログインできないという問題を解決しました。

Sudo dscl . -change /Users/jenkins UserShell /usr/bin/false /bin/bash

これで、su jenkinsでログインできるはずです。

5
Ivo Dancet

Xcodeプラグインを使用してiOSアプリを構築しました。プロジェクトの構成。

ビルドステップの追加> Xcode>コード署名とOS Xキーチェーンオプションを選択します

キーチェーンのロック解除ボックスに追加し、次のように追加します(例) enter image description here

時々、エラーが出たら

コード署名エラー:...

Jenkinsを再度開き、パスワードをもう一度入力してロックを解除します

4
biolinh

キーチェーンに問題がある人のために、 https://github.com/stisti/jenkins-app で代替のJenkinsインストーラーを試してみることをお勧めします https:// github。 com/stisti/jenkins-app/downloads

Jenkins.appはユーザーセッションでJenkinsを実行するため、キーチェーンアクセスの問題は問題ではありません。

3
sti

Sudoがある場合、passwdを使用してJenkinsユーザーのパスワードを変更できます。その後、Jenkinsパスワードを取得できます。

また、これがあなたにとっての問題かどうかはわかりませんが、私がJenkins経由で使用するANTスクリプトには次のようなものがあります。

<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>
2
Feasoron

何らかの理由で、Jenkinsを新しくインストールしたLionで「セキュリティ」ユーティリティが機能していませんでした。

「sudo su jenkins」の後、新しいキーチェーンを作成できましたが、すべての「default-keychain -s ...」または「unlock」コマンドを無視して、終了ステータスをゼロに戻し、コンソールに何も出力しませんでした。デフォルトまたはログインのキーチェーンを一覧表示しても何も得られず、キーチェーンの検索リストにはシステムキーチェーンのみが含まれていたため、入力した内容を変更できませんでした。

そのユーザーのデスクトップにログインしてKeychain Utilityを起動した後、作成されたキーチェーンが表示され、その後すべてが上の投稿で説明したように機能しました。

Lionでキーチェーンの初期動作の一部が変更されたのか、それとも何かが足りないのだろうか?

1
jazzcat

デーモンではなくOS XユーザーとしてJenkinsCIをインストールして起動することもできます。

  1. 公式インストーラーを使用してjenkinsをインストールします( https://jenkins-ci.org/
    • 次をクリック
    • 「カスタマイズ」をクリックします
    • 「起動時に「jenkins」として起動」の選択を解除します-*重要*このオプションは通常、キーチェーンアクセスでうまく機能しないヘッドレスジェンキンを許可します
  2. 起動http://127.0.0.1:8080
    • 起動しないことを確認する
    • ジェンキンスを停止する必要があるかもしれませんSudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist
  3. ダブルクリック /Applications/Jenkins/jenkins.war
    • もちろん、これは@起動するように自動化する必要があります
  4. 開いた http://127.0.0.1:8080
    • 現在実行されていることを確認します
0
scotopic

この問題を解決するには、 http://appleid.Apple.com にログインして、セキュリティの質問を更新してください。

助けてくれました。

0
Vlad

会社の秘密鍵と公開鍵をキーチェーンに追加しました。作成するプロダクションのプロビジョニングプロファイルを追加しました。

このユーザーにはアカウントがないため、自分のアカウントでdevcenterにログインしました。プロビジョニング証明書をダウンロードし、Xcodeにロードしました。

たとえば、ビルドロールアカウント専用の証明書を追加しませんでした。ジェンキンス。

これをビルドスクリプトに追加しました:security unlock-keychain -p mySecretPassword as above、but ...

ファイル〜/ .ssh/mypassを作成し、ファイルにパスワードを追加しました。

コマンドは次のようになります。security unlock-keychain -p cat ~/.ssh/mypass

ビルドはチャンピオンのように機能しています。 ipaファイルを取得し、app centralで読み込み、デバイスで動作します。

0
mpechner