以下のコードを見ると、 の新しいインスタンスを作成しているだけRSACryptoServiceProvider
です。キー コンテナー名は、さまざまなパラメーターに基づいて名前を作成するプロパティから初期化されます。このデモ コードにハードコードされた値を追加しました。
このコードは、Windows 2008 R2 サーバーのインストールで実行されており、キー コンテナー名に対して定数値が返される状態で数か月間動作しています。
数日前にコードが機能しなくなり、以下の例外に直面しています。何ヶ月も使用されていたキー コンテナー名を使用することはできなくなりました。サーバーが再起動され、IIS が再起動されました - 成功しませんでした。キー名を変更して初めて、再び機能し始めました。
なぜこれが起こっているのか、それを修正する方法を誰かが説明できますか? 私が見る限り、このコードは永続オブジェクトを作成しません。再起動後も失敗するのはなぜですか? MSDN (http://msdn.microsoft.com/de-de/library/ca5htw4f.aspx) から、コンストラクター「コンストラクターは、KeyContainerName フィールドを使用して指定されたキー コンテナーを作成または再利用する」ことを読みました。「再利用」とは、何かをどこかにキャッシュしていて、それをしている間にクラッシュして、キャッシュされたバージョンが破損したままになっていることを意味しますか? また、同じキー名が現在も他の多くのマシンで使用されていることに注意してください。どこにも問題はありません。
これはクラッシュしている行です:
using ( RSACryptoServiceProvider rsa = new RSACryptoServiceProvider( this.oCspParameters ) )
{
}
使用される CspParameters は次のとおりです。
private readonly CspParameters oCspParameters = new CspParameters
{
Flags = CspProviderFlags.UseMachineKeyStore,
};
this.oCspParameters.KeyContainerName = oProfile.KeyName;
そして、それがキー名です:
public string KeyName
{
get
{
return string.Format( "API-{0}-v{1}", "TestClient", "1.0.0.0" );
}
}
そして最後に例外:
CryptographicException: An internal error occurred.
Service Operation: ISessionService.Identify #f173250b-d7ac-45d5-98ed-7fffcf37d95a
at System.Security.Cryptography.Utils.CreateProvHandle(CspParameters parameters, Boolean randomKeyContainer)
at System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle)
at System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair()
at System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 dwKeySize, CspParameters parameters, Boolean useDefaultKeySize)