2

当社の Web サービスは、次のコードを含むサードパーティ ライブラリをラップしています。

IIS 6 アプリケーション プールで Active Directory サービス アカウントを使用しています (対話型ログイン機能はありません)。「指定されたファイルが見つかりません」というエラーでサービスが失敗します。エラーの原因をRSACryptoServiceProvider provider = new RSACryptoServiceProvider();. サード パーティのアセンブリは、暗号化プロセスを x509 ファイル ベースの証明書に依存しており、サービス アカウントにはキー フォルダーへの読み取り/書き込みアクセス権があります。さらに、サービス アカウントには、次に対する読み取り、書き込み、変更の権限があります。

「C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys」.

コード:

StringBuilder builder = new StringBuilder(publicKeyData);
builder.Replace("-----BEGIN CERTIFICATE-----", "");
builder.Replace("-----END CERTIFICATE-----", "");
X509Certificate2 certificate = new X509Certificate2( Convert.FromBase64String(builder.ToString()));

string xmlString = certificate.PublicKey.Key.ToXmlString(false);

RSACryptoServiceProvider provider = new RSACryptoServiceProvider(); //BOOM
CspKeyContainerInfo containerInfo = provider.CspKeyContainerInfo;

provider.PersistKeyInCsp = false;
provider.FromXmlString(xmlString);
loadedKeys.Add(key, provider);
provider2 = provider;

FileMon をクラックして開いたところ、その AppPool に FILE NOT FOUND があり、その後にまったく同じファイルに別の SUCCESS があることに気付きました。

私はここで私の要素から外れています。なぜこれが見られるのかについて誰か考えがありますか?

4

2 に答える 2

1

エラーの原因についてはわかりませんが、公開鍵を xml エンコードおよびデコードする代わりに、次のようにすることができます。

StringBuilder builder = new StringBuilder(publicKeyData);
builder.Replace("-----BEGIN CERTIFICATE-----", "");
builder.Replace("-----END CERTIFICATE-----", "");
X509Certificate2 certificate = new X509Certificate2( Convert.FromBase64String(builder.ToString()));

RSACryptoServiceProvider provider = 
  (RSACryptoServiceProvider) certificate.PublicKey.Key;

loadedKeys.Add(key, provider);
provider2 = provider;

運が良ければ、エラーを回避できます。

于 2009-02-06T20:23:55.003 に答える
0

これが表示される理由は、RSACryptoService プロバイダーがマシン キー ストアで排他ロックを開くためです。証明書を読んでいるかどうかは関係ありません。オブジェクトを使用するとロックが発生します

それを回避する2つの方法:

  1. Microsoft 以外の RSA スタックを使用します。
  2. オブジェクトへのアクセス中に lock() を使用します。

私は同じことに遭遇し、独自の RSA 関数セットを作成することになりました。

ASP.NET プールでユーザー プロファイル アフィニティを設定することもできます。そうすれば、ユーザー プロファイルのキーストアが代わりに使用されます

于 2011-10-19T02:51:47.473 に答える