クライアントに配布される小さなコンソール アプリケーション (200kb 未満) があり、クライアントが最新バージョン (WCF サービスによって検証済み) を実行することを確認したいと考えています。現在、HTTPS 経由で新しい .exe ファイルをダウンロードし、現在の .exe ファイルを置き換えます。
サーバーが侵害されていないと仮定すると、これで問題ありません。ただし、コードサイニング証明書を使用して .exe ファイルにも署名します。これを確認して、一致しない場合はファイルを削除する方法はありますか? ファイルがウイルスである場合に備えて、実行されることなくファイルを検証して削除できる必要があります。
署名済みの .exe ファイルを確認するにはどうすればよいですか? たとえば、Windows は無効かどうかを表示します。
編集:このコードは仕事をしますか?
X509Certificate basicSigner = X509Certificate.CreateFromSignedFile(file);
X509Certificate2 cert = new X509Certificate2(basicSigner);
if (cert.Subject.Contains("CN=MY COMPANY NAME IN CERTIFICATE"))
valid = true;
編集: もチェックするStrongNameSignatureVerificationEx
と、ファイル内の 1 ビットが変更されると、失敗して返されます。おそらくこれで十分ですか?
[DllImport("mscoree.dll", CharSet = CharSet.Unicode)]
static extern bool StrongNameSignatureVerificationEx(string wszFilePath, bool fForceVerification, ref bool pfWasVerified);
編集: WinTrust.dllでWinVerifyTrustを呼び出して Authenticode 署名を実際に検証するこのコードも実装しました: http://www.pinvoke.net/default.aspx/wintrust.winverifytrust
これで、デジタル署名に正しいサブジェクトが含まれているかどうか、有効な信頼されたルートからのものかどうか、署名が有効かどうか、およびコードがデジタル署名で厳密に命名されているかどうかがチェックされます。これで十分に安全なはずですか?