いくつかの 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) 秘密鍵のパスワードが許可されたユーザーから提供された署名用の秘密鍵をビルド サービスで作成しますか?