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


107

概要:

OS XでのJenkinsの設定は、最新のインストーラー(1.449-2012年3月9日現在)で大幅に簡単になりましたが、コード署名のプロセスの管理は非常に難しく、簡単な答えはありません。

動機:

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

バックグラウンド:

処理する:

OS X インストーラパッケージを介してJenkins CIをインストールします。「Installation Type」のステップで、「Customize」ボタンをクリックし、「Start at boot as '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 ...「デフォルトのキーチェーンが見つかりませんでした」と表示されます

以下でIvo Dancetが指摘しているように、jenkinsデーモンのUserShellはデフォルトで/ 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

わかりました。これでデフォルトのキーチェーンができました。右に進みましょうか?しかし、最初になぜデフォルトのキーチェーンを作成する必要があったのでしょうか?

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

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

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

指しているサイモンUrbanekの答えあなたはプレーンテキストのパスワードを使用してスクリプトからキーチェーンのロックを解除することがあります。jenkinsデーモンのキーチェーンに「使い捨て」の証明書とキー以外のものを保持することは無責任だと思われます。

私はそれとは反対の議論に非常に興味があります。私は過度に注意していますか?

ターミナルでjenkinsデーモンとして新しいCSRを作成するには、次のようにしました...

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

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

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

CIで使用するためにプロビジョニングポータルで特別なプロビジョニングプロファイルを作成しました。何か問題が発生した場合の影響を少し小さくしたいと考えています。ベストプラクティスまたは過度に慎重ですか?

  1. sudo su jenkins
  2. mkdir ~/Library/MobileDevice
  3. mkdir ~/Library/MobileDevice/Provisioning\ Profiles
  4. プロビジョニングポータルで設定したプロビジョニングプロファイルをこの新しいフォルダーに移動します。コマンドラインからxcodebuildをjenkinsとして実行できるようになるまで、もう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>

この設定では、JenkinsXcodeプラグインもお勧めします。これにより、xcodebuildスクリプトの設定が少し簡単になります。この時点で、xcodebuildのmanページも読むことをお勧めします-ターミナルでここまでたどり着きましたね?

この設定は完璧ではなく、アドバイスや洞察は大歓迎です。

私が問題を解決するために使用するようになったのは、ほぼすべての人の入力のコレクションであったため、「正しい」答えを選択するのに苦労しました。私は全員に少なくとも賛成票を投じようとしましたが、サイモンは元の質問にほとんど答えたので、サイモンに回答を与えました。さらに、Sami Tikkaは、JenkinsをAppleScriptを介してプレーンなOS Xアプリとして動作させる彼の努力に多大な貢献をしました。Jenkinsを起動してユーザーセッション内ですばやく移動することだけに関心がある場合(つまり、ヘッドレスサーバーとしてではない場合)、彼のソリューションはMacに非常に似ています。

私の努力がさらなる議論の火付け役となり、週末にiOSプロジェクトのJenkins CIセットアップを手に入れられると思っている次の貧しい人々が、それについて聞いたすべての素晴らしいことを助けてくれることを願っています。


更新:2013年8月9日

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

レッスン1:ジェンキンスを公共のインターネットに公開しないでください

2012 WWDCで、私はこの質問をXcodeおよびOS X Serverエンジニアに尋ねました。「やめろ!」というカコフォニーを受け取った。私が尋ねた人から。彼らは全員、自動化されたビルドプロセスは優れているが、サーバーはローカルネットワーク上でのみアクセス可能である必要があることに同意しました。OS X Serverエンジニアは、VPN経由のリモートアクセスを許可することを提案しました。

レッスン2:新しいインストールオプションが追加されました

私は最近、CocoaHeadsに私のJenkinsの体験について話しました。そして驚いたことに、いくつかの新しいインストール方法を見つけました-HomebrewとBitnami Mac App Storeバージョンです。これらは間違いなくチェックアウトする価値があります。Jonathan Wrightが、Homebrew Jenkinsを機能させるための詳細を説明してます。

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

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

TL; DR

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


10
私はこの簡潔で完全な質疑応答に
賛成票

OS X YosemiteでのJenkinsの起動に何か問題がありました-Jenkinsのインストーラーを使用しました。
Jonny 2014

証明書をシステムキーチェーンに移動して、幸せになります;)
Julian F. Weinert 2015年

回答:


30

キーチェーンを使用するには、ロックを解除する必要があります。security unlock-keychainロック解除に使用できます。対話的に(より安全に)、またはコマンドラインでパスワードを指定して(安全でない)、次のように実行できます。

security unlock-keychain -p mySecretPassword...

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

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


しかし、システムのキーチェーン以外のキーチェーンをロードするのも困難です。security unlock-keychain -p password -k /path/codesign.keychain動作しません。
edelaney05

上記の例のようにデフォルトのキーチェーンを使用しましたか?カスタムキーチェーンの場合は、最初に検索パス上に配置する必要があるため、最初にデフォルトのキーチェーンを試してください。また、-k引数がないunlock-keychainため、実行しようとしていることが正しくないように見えます(を参照security help unlock-keychain)。
Simon Urbanek

私は少し違うことを試しましたが、最終的には同じ場所に戻ってきました。私は私の質問を編集しました、うまくいけばそれは少し明確ですか?
edelaney05

元の質問とは完全に異なります...まず、jenkinsとして(例:経由でsudo -u jenkins bash)ログインし、パス全体に対する権限があることを確認します。あなたはあなたが言わなかった多くのことをしたので(dsclユーザーを作成するのに使うのと同じように)、あなたは本当に一人でいます。また、ホーム設定を確認することもできます(シェルを設定したかどうかに応じsudo -u jenkins -iて、対応するログイン設定を取得するために使用できます)。
Simon Urbanek、2012

12

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

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

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

もちろん、Apple WWDCRA証明書も必要です。ほとんど同じ方法でインポートされます。

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

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

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

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

また、プロビジョニングプロファイルにアクセスする必要があります。これらの手順を編集して、この投稿ですぐに説明します。


1
プロビジョニングプロファイルのアクセス手順で更新していただけませんか?
ルーク

関連するアプローチについては、modeset.com / what-we-know / 2013/03/11 / jenkins_keychain_timeoutsを参照してください。
ギリ

5

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

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

それを設定したら、コマンドを実行できます

security list-keychains

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

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

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

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


同じプロビジョニングプロファイルの問題が発生しています。これを解決する方法について何か考えはありますか?
サントッシュ

2
Jenkinsユーザーのプロビジョニングプロファイルは「/ Users / Shared / Jenkins / Library / MobileDevice / Provisioning Profiles」に保存されているので、ビルドにステップを入れて、プロビジョニングプロファイルをgitリポジトリ内からその場所にコピーしました。これにより、プロビジョニングプロファイルを更新してSCMにプッシュすることができ、Jenkinsはその変更を自動的に取得します。
brianestey 2012

login.keychainをjenkinsキーチェーンライブラリにコピーする場合は、それをchownして、jenkinsユーザーがセキュリティでロックを解除できるようにする必要があります
ganoro

1
あなたはヒーローです。私は2日間頭の毛を引き裂き、
証明書

5

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

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

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

これで、でログインできるようになりますsu jenkins


これは私にとって非常に役に立ちましcreate-keychainた。jenkinsユーザーでコマンドが機能しないという同様の問題がありました。このコマンドを実行すると問題が解決したようです。
lxt

jenkinsユーザーパスワードを変更するコマンドを実行すると、現在のパスワードの入力を求められます。これが何なのかわからないので、Enterキーを押すことはできません。助言がありますか?
CMVR 2013年

4

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

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

ダニアンロックキーチェーンボックスをして(例のために)次のように追加します ここに画像の説明を入力してください

時々、エラーが発生した場合

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

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


3

キーチェーンに問題がある場合は、代わりのJenkinsインストーラー(https://github.com/stisti/jenkins-app)、ダウンロード(https://github.com/stisti/jenkins-app/downloads)を試すことをお勧めします

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


懸念事項は、このJenkinsユーザーがデーモンスペースではなくユーザースペースにいることです。そのため、攻撃者がJenkinsユーザーを危険にさらすことができた場合、ユーザーはコンピューターに完全にアクセスできます。
edelaney05 2012年

これは私が得ている問題を解決するかもしれません。問題は、既存のJenkinsインストール(逆方向に行われた)があり、すべてのビルドを失いたくない-などです。私のcasEでは何が起こりますか?
Mike S

2

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>

1
"macbuild"ユーザーでJenkinsをセットアップしているようです。このユーザーはデーモンではなくユーザーであると想定しています。キーチェーンをコマンドライン引数を介してロック解除する必要があることは(今)確実に理解しています(Simon Urbanekのコメントを参照)。しかし、jenkinsデーモンのデフォルトのキーチェーンを作成する方法はまだわかりません。
edelaney05

1

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

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

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

Lionでキーホルダーの初期動作の一部が変更されたのか、それとも何か不足しているのだろうか?


Lionの「クリーン」インストールで上記の手順を実行したので、飛び込む前にセキュリティに問題があったのではないでしょうか?もう1つの可能性は、最初に投稿してからセキュリティ/ OS Xの更新があったことですか?
edelaney05 2012

0

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

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

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

私はこれをビルドスクリプトに追加しました:上記のようにsecurity unlock-keychain -p mySecretPasswordですが...

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

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

ビルドはチャンピオンのように機能しています。私はipaファイルを取得します。それはApp Centralにロードされ、デバイスで動作します。


0

デーモンの代わりにOS XユーザーとしてJenkinsCIをインストールして起動することもできます。

  1. 公式インストーラーを使用してジェンキンスをインストールします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
    • 実行中であることを確認します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.