gpt4 book ai didi

c# - 对于某些键名,RSACryptoServiceProvider(RSACryptoServiceProvider) 构造函数在 .NET 3.5 中崩溃

转载 作者:行者123 更新时间:2023-12-04 02:16:30 25 4
gpt4 key购买 nike

如果您查看下面的代码,它只是创建了一个 RSACryptoServiceProvider 的新实例。 key 容器名称是从一个属性初始化的,该属性根据各种参数创建名称。我在此演示代码中添加了硬编码值。

代码在 Windows 2008 R2 服务器安装上运行,并且已经工作了几个月,并为 key 容器名称返回了一个常量值。

几天前代码停止工作,我们面临以下异常。使用已经使用了几个月的 key 容器名称不再有效。服务器已重新启动,IIS 已重新启动 - 没有成功。只有在更改 key 名称后,它才重新开始工作。

有人可以解释为什么会发生这种情况以及如何解决它吗?据我所知,这段代码没有创建任何持久对象。为什么重启后还是失败?从 MSDN (http://msdn.microsoft.com/de-de/library/ca5htw4f.aspx) 我读到构造函数“构造函数创建或重用使用 KeyContainerName 字段指定的 key 容器”。 “重用”是否意味着,它正在将内容缓存在某个地方,而在这样做时它崩溃了,现在卡在了损坏的缓存版本中?另请注意,相同的 key 名称目前仍在许多其他机器上使用 - 任何地方都没有问题。

这是崩溃的行:

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" );
}
}

最后是异常(exception):

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)

最佳答案

As far as I can see, this code does not crete any persistent objects

以下代码创建 key 容器(如果它尚不存在):

using ( RSACryptoServiceProvider rsa = new RSACryptoServiceProvider( this.oCspParameters ) ) 
{
}

如果你想强制使用现有的 key ,你应该指定:

cp.Flags = CspProviderFlags.NoPrompt | CspProviderFlags.UseExistingKey | CspProviderFlags.UseMachineKeyStore;

Does the "reuse" mean, it is caching the stuff somewhere and while doing that it crashed and is now stuck with a corrupt cached version?

它将重用存储在 Environment.SpecialFolder.CommonApplicationData 文件夹的 Microsoft\Crypto\RSA\MachineKeys\ 子文件夹中的 key ,如果它存在并且您有权限访问它。否则它将尝试创建它。

也许那里有一个您无权访问的 key ?

key 容器的文件名使用生成的唯一 ID (CspKeyContainerInfo.UniqueKeyContainerName),但您可以使用文本编辑器检查文件内容, key 容器名称在文件的前几个字符中。

找到有问题的文件后,您可以检查其权限,并可能将其删除以便重新创建。

来自评论:

How can I force it then to NOT do so or how can I delete the container?

您可以使用以下代码删除现有 key 容器(前提是您具有必要的权限):

CspParameters cp = new CspParameters();
cp.Flags = CspProviderFlags.NoPrompt | CspProviderFlags.UseExistingKey |
CspProviderFlags.UseMachineKeyStore;
cp.KeyContainerName = containerName;

using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp))
{
rsa.PersistKeyInCsp = false;
}

我还没有尝试过,但也许在创建 key 时设置 PersistKeyInCsp=false 会阻止 if 被持久化。

但是,以上都不能解释为什么您无法再访问之前成功使用的 key 。最明显的原因是权限 - 我知道如果您尝试访问您无权访问的 key 容器,您会得到一个 CryptographicException,但我不知道您是否希望得到比“发生内部错误”更明确的错误消息。我要做的第一件事是检查 key 容器文件上的 ACL。也许您有两个在不同身份下运行的应用程序实例,它们试图创建 key 容器 - 而身份 2 无法访问由身份 1 创建的 key 容器。

最后,您似乎建议您不想保留 key 容器,为什么要使用机器存储?

关于c# - 对于某些键名,RSACryptoServiceProvider(RSACryptoServiceProvider) 构造函数在 .NET 3.5 中崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11329955/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com