12

いくつかの ClickOnce 配置アーティファクト (アプリケーション exe とマニフェスト) のコード署名を自動化したいと考えています。これを達成するためにsigntoolを使用しています。秘密キーを署名できるようにし、秘密キーを含む証明書ファイル (.pfx ファイル) を保護するために、エクスポートできないキーを使用して証明書をローカル コンピューターの証明書ストアにインストールすることを計画しています。(エクスポート不可とマークされていても、キーをエクスポートする方法があることは承知しています。)このマシンは、選ばれた少数のユーザーがアクセスできる継続的インテグレーション サーバーです。私の希望は、秘密鍵を使用する必要があるときはいつでも、秘密鍵のパスワードを入力する必要があるように設定することでした. 次に、自動化されたジョブをセットアップします ( Jenkinsを使用)) これには、秘密鍵のパスワードを収集するビルド パラメーターが必要です。Mask Passwords プラグインは、入力中およびコンソール出力でパスワードをマスクするために使用されます。

ただし、いくつかの障害に遭遇しました。まず第一に、「強力な秘密鍵保護を有効にする。このオプションを有効にすると、秘密鍵がアプリケーションによって使用されるたびにプロンプ​​トが表示されます。」がありますが。証明書をインポートすると、ローカル マシン ストアではなく、現在のユーザー ストアにインポートする場合にのみ使用できるように見えます。第 2 に、このオプションが使用可能であったとしても、サインツール ツールは、ストア内の証明書を使用して署名するときにパスワードを設定するオプションを提供しません。パスワード パラメータ '/p' は、秘密キーのソースとして pfx ファイルを使用する場合にのみ適用されます ('/f' オプション)。それを考えると、これは実行可能なオプションではないようです。注: 「強力な秘密鍵保護を有効にする」場合でも。マシン ストアの証明書に使用できます。私のテストでは、このオプションを有効にして証明書を使用しようとすると、それを使用する許可を求めるダイアログがポップアップするだけで、自動化されたジョブでは明らかに機能しないことが示されています。私は当初、「プロンプト」とはパスワードを要求することを意味すると考えていました。

私が検討したもう 1 つのオプションは、ACL を作成して証明書ストア内の秘密鍵を保護することです。これを行うには、証明書を右クリックして [すべてのタスク...] を選択します。秘密鍵の管理... ダイアログ。これにより、秘密鍵の使用が許可された人だけに制限されます。(注: 秘密鍵に対するアクセス許可を持たないユーザーが署名に秘密鍵を使用しようとすると、「SignTool エラー: 指定されたすべての基準を満たす証明書が見つかりませんでした。」というメッセージが表示されます。) Jenkins ビルド サービスで使用されている資格情報に追加すると、ビルド ジョブはコードに署名できるようになります。特定のユーザーとして署名コマンドを実行するスクリプトを実行するジョブを作成できます。これには、ドメイン ユーザー名とパスワードをビルド パラメーターとして取り込む必要があります。これは、Jenkins Mask Passwords プラグインを使用して行うことができます。私はそれがあまり好きではありません.Mask Passwordsがドメイン資格情報の公開を防ぐのに十分な保護であることに満足していない.

証明書をマシン ストアに保存するという当初の考えを放棄した場合、証明書の pfx ファイルを、ビルド プロセスと署名ユーザーのみがアクセス許可を持つビルド マシン上の ACL で保護されたフォルダーに配置するオプションがあります。そうすることで、マシンにアクセスできる他のユーザーにファイルを公開せずに、含まれている秘密鍵を使用するビルド ジョブを作成できます。秘密鍵を使用するには、ビルド パラメーターで秘密鍵のパスワードを収集する必要があります。

最後に、証明書を保存するためにスマート カードを使用するオプションがありますが、これは使用しないことにしました。

したがって、私の質問は、1) 秘密鍵がコピーされるのを防ぐ、2) 秘密鍵が権限のないユーザーがコードに署名するために使用されるのを防ぐ、3) 秘密鍵のパスワードが許可されたユーザーから提供された署名用の秘密鍵をビルド サービスで作成しますか?

4

3 に答える 3

5

まず第一に、私はあなたの質問に個別に答えようとします:

  1. 秘密鍵がコピーされないように保護する:
    暗号化ハードウェア (スマートカードまたは hsm) だけが鍵のコピーを実際に保護できます。Windows証明書ストア(正しく指摘したようにエクスポートできないオプションを使用しても)またはPKCS#12(PFX)ファイルは、誤った保護の感覚しか提供しません。
  2. 認証されていないユーザーが秘密鍵を使用してコードに署名するのを防ぎます:
    IMO これには、パスワードや PIN の入力などのユーザー操作が必要です。パスワードをパラメータとして渡すと、プロセス情報やログなどから他のプロセスがパスワードを取得できる可能性が常にあります。
  3. 秘密鍵のパスワードが許可されたユーザーによって提供されると、ビルド サービスによって署名用の秘密鍵が作成されます。
    対話的に入力された PIN を使用して CSP (Windows 証明書ストア) 経由でアクセスできる暗号化ハードウェア (スマートカードまたは hsm) は、signtool で問題なく動作するはずです。

ユーザー操作の要件は、自動ビルド サービスにとって必ずしも便利ではないことに同意しますが、おそらく、ユーザー操作のある安全なソリューションと、ユーザー操作のない安全性の低いソリューションのどちらかを選択する必要があります

便利だが安全性の低いソリューション No. 1 : 不利な点が何も示されていないため、受け入れ可能な解決策を既に見つけているように思えます。

証明書をマシン ストアに格納するという当初の考えを放棄した場合、証明書の pfx ファイルを、ビルド プロセスと署名ユーザーのみがアクセス許可を持つビルド マシン上の ACL で保護されたフォルダーに配置するオプションがあります。そうすることで、マシンにアクセスできる他のユーザーにファイルを公開せずに、含まれている秘密鍵を使用するビルド ジョブを作成できます。秘密鍵を使用するには、ビルド パラメーターで秘密鍵のパスワードを収集する必要があります。

ただし、PFX ファイルは、ライブ システムからだけでなく、バ​​ックアップからも検出されずにコピーされる可能性があることに注意してください。

便利だが安全性の低いソリューション No. 2 : PIN の入力を必要としないスマートカードに秘密鍵を保存し、信頼できるユーザーのみにシステム アクセスを許可します。これにより、署名ツールで簡単にアクセスできる一方で、秘密鍵をコピーできないことが保証されます。ただし、すべてのユーザーがアクセスできるスマートカードのないサーバーと、信頼できるユーザーのみがアクセスできるスマートカードのサーバーの 2 つの別個のビルド サーバーが必要になる可能性があります。

不便な安全なソリューション: PIN の入力が必要なスマートカードに秘密鍵を保存し、ビルド プロセス中にユーザーの操作 (PIN の入力) を必要とします。

自動モードで自己署名コード署名証明書を使用して開発ビルドに署名し、手動モードで信頼できるコード署名証明書を使用してパブリック リリース ビルドに署名することも検討できます。

于 2014-03-16T20:29:03.610 に答える
-1

証明書ストアではなく、パスワードで保護された PFX ファイルに依存する方が安全なようです。PFX が存在するハード ドライブ フォルダーに ACL 保護がなくても、PFX ファイルを取得した人は、パスワードを持っていない限り、それを使用して何かに署名することはできません。

次に、そのコンピューターでパラメーター化された Jenkins の「署名」ジョブをセットアップし、PFX パスワードを完全にカプセル化して、誰もそれを見ることができないようにします。(Powershell などのスクリプトをブラックボックス EXE に変換することを考えています。) 承認された Jenkins ジョブを署名ジョブにチェーンして、署名を完了することができます。EXE は、監査機能として、使用されるたびにログに記録します。署名ジョブの不正使用を防止する方法を理解する必要があるだけです...それを行う方法があるはずですか?

于 2016-06-23T18:07:50.510 に答える