2016-07-12 7 views
1

C#を使用しているプロジェクトで、.exeファイルの信頼性をチェックしたかったのです。インターネットに接続されていないマシンでWinVerifyTrust()が失敗するのはなぜですか?

私が言及している - ここでhttp://pinvoke.net/default.aspx/wintrust/WinVerifyTrust.html

は私のコードスニペットです。

WinTrustData wtd = new WinTrustData(filename); 
Guid guidAction = new Guid(WINTRUST_ACTION_GENERIC_VERIFY_V2); 
WinVerifyTrustResult result = WinVerifyTrust(INVALID_HANDLE_VALUE, guidAction, wtd); 
bool valid = (result == WinVerifyTrustResult.Success); 

ファイル名 - .exeファイルのパスです。

上記のコードに記載されているWinVerifyTrust()は、マシンが少なくとも1回インターネットに接続されている場合にのみ "WinVerifyTrustResult.Success"を返します。

ただし、新しいマシンでは「0x800b0100」つまり「Trust_e_nosignature」を返します。

予想される動作ですか?はいの場合はどのように解決するのですか?

この特定の動作を検索しましたが、満足のいく回答が見つかりませんでした。

+0

これは実際の生活と変わらないものではありません。あなたが誰かにあなたの家を売るならば、あなたはバイヤーが彼が言っている人であると信じることができますし、彼が署名した契約は法的文書になるでしょうか?あなたは公証人に行く、あなたは家から出なければならない。ここの公証人はVerisignのような証明書の発行者です。家から出るにはインターネット接続が必要です。 –

答えて

2

Windows(7+)には、非常に限られたルート証明書セットが付属しています。

これらは必要に応じてダウンロードされます。これは、コンピュータがインターネットに接続されていなかった場合、authenticodeの署名が検証できない理由です(ただし、まだインターネットに接続するだけでは不十分ですが、httpsのページにサーフィンしたり、 「正しい」ルート証明書がダウンロードされるようにする必要があります)。

これは、インターネットに接続する前と後でインターネットエクスプローラにインストールされているCA証明書を確認/カウントすることで確認できます。

+0

こんにちはMrTux、お返事ありがとうございました。プロキシ設定を追加すると私の問題が解決されます。しかし、私たちの場合、彼らは故意にインターネットに接続したくない多くのユーザーです。それは非常に困難になります。私の質問は、このような状況を回避する方法です。ユーザーが自分のマシンをフォローするように設定できることは知っていますか?または、それは好きです - このAPIのインターネット接続は必須です。 – Tausif

+1

私は、必要なルート証明書を手動で(またはアクティブなディレクトリなどを使用して)インストールする以外にも、回避策を認識していません。また、Windows自体でもルートCA証明書なしで署名を検証することはできません。 – MrTux

+0

また、ルート証明書を含むメモリ内に独自のcertstoreを設定し、ここで説明するようにチェックすることで、より手作業の証明書検証を試みることもできます。http://stackoverflow.com/q/2008519/3906760 – MrTux

関連する問題