如果您查看下面的代码,它除了创建一个新的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)