4

xml を返す単純な rest コマンドを使用して呼び出さなければならないブラック ボックス サービスがあります。

彼らは、IE で実行し、IE の証明書セクションにインストールする必要がある証明書を発行してくれました。彼らの指示に従って、チェーン全体をパスワード付きのpfxとしてエクスポートしました。

証明書が直接発行されたマシンでは、すべてがコードで正常に動作します

        var certHandler = new WebRequestHandler();
        certHandler.ClientCertificateOptions = ClientCertificateOption.Manual;            
        certHandler.UseDefaultCredentials = false;

        var certificate = new X509Certificate2(Properties.Resources.SigningCert, "password", X509KeyStorageFlags.DefaultKeySet | X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.PersistKeySet); //Must be renewed and replaced every year.
        certHandler.ClientCertificates.Add(certificate);            

        //Execute the command            
        var client = new HttpClient(certHandler);
        string result;
        try
        {
            result = await client.GetStringAsync(url);

            System.Diagnostics.Debug.WriteLine(result);
        }
        catch (Exception ex)
        {
            throw ex;
        }

(証明書をリソースに保存しましたが、正常にロードされ、開発者のマシンでもファイルからのロードが正常に機能します。)念のため、サーバー上のIEにもインポートしました。明らかに、これは間違った証明書ストアの下にある可能性がありますが、これをグローバルにロードする方法がわかりませんでした。サーバー上の IE でも同じ REST GET が機能し、開発者のマシン上で機能するのと同じように機能します。失敗するのはコードだけです。)

本番環境では、この同じコードが 403 禁止をスローします。

本番環境 (実際にはベータ サーバー) は、実際には開発マシンと同じ nat の背後にあるため、同じ IP が通過するのを見ています。

開発者ボックスではなくサーバーで失敗する理由はありますか?

ありがとう!

4

2 に答える 2

4

X509KeyStorageFlagsアプリが実行されているアカウントに従って使用する必要があります。もしそれが

1) 通常の Windows ユーザー アカウントで実行されるアプリを使用する必要があります

X509Certificate2(Properties.Resources.SigningCert, "password", X509KeyStorageFlags.UserKeySet);

2) LocalSystem の下の Windows サービス、NetworkService の下の IIS、または組み込みの Windows アカウントの下のその他のサービスを使用する必要があります。

X509Certificate2(Properties.Resources.SigningCert, "password", X509KeyStorageFlags.MachineKeySet);

基本的に、X509KeyStorageFlags.PersistKeySetあなたのケースでは使用しないでください - 毎回 pfx 形式から証明書をインポートします。

証明書の秘密鍵は、フラグに従ってコンテナに格納されています。したがって、間違ったフラグを使用すると、アクセスできなくなる可能性があります。 ( msdnDefaultKeySet )の単なるエイリアスではありません。そのため、あらゆる場合に適切なフラグを選択してください。UserKeySet

これらの記事も役立つ場合があります。

  1. キーの保管と取得
  2. .NET で X.509 証明書を操作するための 8 つのヒント
  3. 証明書の仕組み
于 2014-07-17T21:33:16.740 に答える
1

私が見つけたのは、何らかの理由で、キーに適切にアクセス許可を付与できないということです。それを回避するために、私は次の場所に行きました:

X:\Users\All Users\Microsoft\Crypto\RSA\MachineKeys

エクスプローラーで問題のキーを見つけ(日付による控除を使用しましたが、拇印があるので一致させることができるはずです)、右クリックしてファイルのアクセス許可を引き継ぎ、手動でアクセス許可を設定しました。

その後、私のコードが機能し始めました。

興味深いことに、これを展開する必要のある別のマシンでは、ファイルが machinekeys ディレクトリに存在しないため、そこで何をするかわかりませんが...

于 2012-11-22T13:48:45.990 に答える