Construtor RSACryptoServiceProvider (RSACryptoServiceProvider) travando no .NET 3.5 para determinados nomes de chaves
Se você olhar o código abaixo, não está fazendo nada além de criar uma nova instância de umRSACryptoServiceProvider
. O nome do contêiner de chave é inicializado a partir de uma propriedade que cria um nome com base em vários parâmetros. Eu adicionei valores codificados neste código de demonstração.
O código está sendo executado em uma instalação do servidor Windows 2008 R2 e funcionou durante meses com um valor constante sendo retornado para o nome do contêiner de chave.
Alguns dias atrás, o código parou de funcionar e estamos enfrentando a exceção abaixo. Usar o nome do contêiner de chave que foi usado por meses não funciona mais. O servidor foi reinicializado, o IIS foi reiniciado - sem sucesso. Somente depois de alterar o nome da chave, ele começou a funcionar novamente.
Alguém pode explicar por que isso está acontecendo e como consertá-lo? Tanto quanto eu posso ver, este código não creta quaisquer objetos persistentes. Por que ainda falharia depois de uma reinicialização? Do MSDN (http://msdn.microsoft.com/de-de/library/ca5htw4f.aspx) eu li que o construtor "construtor cria ou reutiliza um contêiner de chave especificado usando o campo KeyContainerName". Faz o"reuso"Quer dizer, ele está armazenando o material em cache em algum lugar e, ao fazer isso, travou e agora está preso a uma versão corrompida em cache? Observe também que o mesmo nome de chave ainda é usado em muitas outras máquinas - sem problemas em lugar algum.
Esta é a linha que está falhando:
using ( RSACryptoServiceProvider rsa = new RSACryptoServiceProvider( this.oCspParameters ) )
{
}
Estes são os CspParameters usados:
private readonly CspParameters oCspParameters = new CspParameters
{
Flags = CspProviderFlags.UseMachineKeyStore,
};
this.oCspParameters.KeyContainerName = oProfile.KeyName;
E esse é o nome da chave:
public string KeyName
{
get
{
return string.Format( "API-{0}-v{1}", "TestClient", "1.0.0.0" );
}
}
E finalmente a exceção:
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)