20

私のシナリオは、特定のフォルダーにある場合に他のプログラムを起動する 1 つのプログラム (exe) があるというものです。私たちの企業証明書 (Verisign 承認済みなど) で署名されたプログラムのみが開始されるようにしたいと考えています。基本的に、それ自体と同じ証明書を持つプログラムのみを開始します。証明書自体を発送したくありません。

私は Web とシステム名前空間を検索してきましたが、ファイルから証明書データを読み取り、それを検証し、別のファイルと照合できる明確な例を見つけられませんでした。私が見つけた最も近いのはSigntoolであり、この検証を別のexeで行うことはあまり意味がありません。ここで有益に説明されているように、デジタル署名されたファイルは異なるため、厳密な命名は役に立たないことを知っています (http://blog.codingoutloud.com/2010/03/13/three-ways-to-tell-whether-an-assembly- dl-is-strong-named/) また、生データの暗号化と検証を示す SO の他の例もいくつかありますが、何らかの方法でパッケージ化されたアセンブリではありません。

アイデアや提案はありますか?

4

4 に答える 4

18

アセンブリの署名を確認する方法に関するコードサンプルを含むブログ投稿は次のとおりです。http:
//blogs.msdn.com/b/shawnfa/archive/2004/06/07/150378.aspx

最後のコードサンプルは、アセンブリがMicrosoftによって署名されているかどうかを確認する方法を示しています。会社の証明書の証明書トークンを取得することで、同じことができます。

更新:ユーザー@Sabreはこれを次の更新で編集しましたが、その更新は他のユーザーによって拒否されました。ただし、これは非常に有効なアドバイスです。SOで承認されないため、編集内容を再投稿します。

編集(ありがとう、OP):これをより安全に(つまり、プログラムをより改ざんされないように)したい場合は、関連するキーで厳密に名前が付けられたプログラム内のアセンブリを参照してから、参照されたアセンブリのトークンを使用します呼び出し元のアセンブリのトークンと比較します。(リンクに従って)バイト配列を使用する場合は、16進数で編集および変更するだけです。

于 2011-02-16T09:48:40.437 に答える
3

ここで 3 つのオプションを試すことができます。

1) 最初のものは、次のようなアセンブリ ロードを使用しています。

Assembly myDll =
    Assembly.Load("myDll, Version=1.0.0.1, Culture=neutral, PublicKeyToken=9b35aa32c18d4fb1");

次の厳密な名前 (Sn.exe) コマンドを使用して、特定のアセンブリの公開キーと公開キー トークンの 16 進形式を出力できます。

sn -Tp <assembly>

公開鍵ファイルがある場合は、代わりに次のコマンドを使用できます (コマンドライン オプションの大文字と小文字の違いに注意してください)。

sn -tp <assembly>

2) 2 つ目はここに記載されています。そのような問題には p/Invoke を使用します。

3) これを行うための 3 番目の、より機敏で、より複雑な方法も存在します。これはバインディング ポリシーです。すでに展開されているアプリケーションのアップグレードを提供する必要がある場合は、これを考慮することができます。アプリケーションが恩恵を受けることができる共有コンポーネントの新しいバージョンが出てきた場合、アプリケーション ポリシー ファイルを使用すると、既存のインストールを再コンパイルまたは置換することなく、これらの利点を提供できます。

この機能の詳細については、次を参照してください。

http://msdn.microsoft.com/en-us/library/aa309359%28v=vs.71%29.aspx

http://ondotnet.com/pub/a/dotnet/2003/03/17/bindingpolicy.html

于 2011-02-16T09:06:31.707 に答える
3

.NET アセンブリには、strongnaming と Authenticode の 2 つの署名テクノロジがあります (authenticode は、.NET アセンブリだけでなく、PE やその他のファイルの署名にも使用されます)。それらはさまざまな目的に使用されます。証明書は、Authenticode で作成者を認証するためにのみ使用されます。ストロングネーミングは作成者をまったく認証しません。

署名を確認するだけでなく、証明書を検証して、特定の作成者に対して発行されたことを確認する必要があります。適切な検証は、CRL (証明書失効リスト) と OCSP (オンライン証明書ステータス) のチェックを含む複雑な手順です。

Authenticode 署名の検証を実行するには、Authenticode 検証コンポーネントが必要です。オプションの 1 つは、 SecureBlackbox 製品のPKIBlackboxパッケージを使用することです。このパッケージには、Authenticode 検証と完全な証明書検証メカニズムが含まれています。

証明書を検証しない場合は、署名を検証しても意味がないことに注意してください。同じサブジェクト、シリアル番号などで自己署名証明書を作成し、それを使用して偽造されたアセンブリに署名できるためです。

于 2011-02-16T07:02:01.990 に答える
0

「信頼」のために強い名前を使用する方法があると思います。Microsoft は、アセンブリの内容が変更されていないことを確認するために厳密な名前のみを推奨し、信頼のために「Authenticode」を使用することを提案していることを理解しています。

ただし、ローダー アプリケーション (これらのアセンブリ/プログラムをロードするアプリケーション) が、ロードできる「アセンブリ」の暗号化されたリストを保持している場合。それは「信頼」の問題を解決しませんか?

たとえば、パッケージ ローダーはアセンブリ名を公開キーで保持し、アセンブリ/プログラムを完全なアセンブリ名でロードできますか?

<PackageHandlers>
  <PackageHandler>
    <Package type="Package1" assembyName="SomeAssembly" publickey="d45755dbb8b44e59" />
  </PackageHandler>
</PackageHandlers>
于 2016-07-22T16:50:41.500 に答える