2

クライアントに配布される小さなコンソール アプリケーション (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.dllWinVerifyTrustを呼び出して Authenticode 署名を実際に検証するこのコードも実装しました: http://www.pinvoke.net/default.aspx/wintrust.winverifytrust

これで、デジタル署名に正しいサブジェクトが含まれているかどうか、有効な信頼されたルートからのものかどうか、署名が有効かどうか、およびコードがデジタル署名で厳密に命名されているかどうかがチェックされます。これで十分に安全なはずですか?

4

2 に答える 2

3

これは、あなたが望むものを達成するために利用可能なオプションのソースコードを含む素晴らしいウォークスルーです...

基本的に、必要なことを行うマネージ API がないため、 StrongNameSignatureVerificationEx をpinvokeする必要があります。

別のオプションは、SignTool を呼び出すことです

于 2012-04-25T21:45:49.697 に答える
1

これは、かなり根本的に間違った方法です。コード署名証明書が証明する唯一のものは、EXE に署名した個人または会社の身元です。認証局は、身元が有効であることを証明するだけです。あなたがまったく証明していないのは、それがあなたの証明書であることです。あなたはそれが誰かの証明書であることを証明しただけです。攻撃者は、あなたの EXE を攻撃者が署名した別の EXE に簡単に置き換えることができます。

あなたはおそらく「でも、それが私のものであることを確認することはできません!」と反対するでしょう. 答えはノーです。攻撃者が EXE を置き換えることができれば、チェック コードを置き換えることも問題ありません。同じマシンで検証を実行することには、セキュリティはありません。

コード証明書の目的は 1 つだけです。署名者の ID をユーザーに証明します。彼らに何か他のことをさせることは、セキュリティホールです。本当に悪い種類で、システムが安全であると感じさせる種類です。そして、本当のセキュリティの実装について考えるのをやめさせます.

于 2012-04-25T23:57:39.377 に答える