如何让RsaProtectedConfigurationProvider生成可导出RSA密钥容器
如何在代码或配置中标记RSA密钥容器为可导出?
好问题!你确实可以通过配置文件或者代码两种方式,把RSA密钥容器标记为可导出,对应aspnet_regiis里的-exp参数。下面分别说明两种实现方式:
1. 在配置文件中直接设置可导出属性
你可以在Sleutels.config的RSA提供程序节点里添加exportable="true"属性,这样当首次加密配置节时,创建的密钥容器就会被标记为可导出。修改后的配置片段如下:
<configProtectedData> <providers> <add name="RSA" type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" keyContainerName="RobinsKeys" useMachineContainer="true" exportable="true" /> <!-- 新增这个属性对应-exp参数 --> </providers> </configProtectedData>
添加这个属性后,重新运行你的加密代码,生成的密钥容器就支持导出了,之后再执行aspnet_regiis -pc "RobinsKeys" -exp就能成功完成导出操作。
2. 在代码中创建可导出的密钥容器
如果你需要在代码层面灵活控制密钥容器的可导出性,可以提前用RSACryptoServiceProvider创建带有可导出标志的密钥容器,再进行配置节加密。示例代码如下:
private static void CreateExportableKeyContainer(string containerName) { var cspParams = new CspParameters { KeyContainerName = containerName, Flags = CspProviderFlags.UseMachineKeyStore | CspProviderFlags.Exportable }; // 初始化RSACryptoServiceProvider会自动创建符合要求的密钥容器 using var rsa = new RSACryptoServiceProvider(cspParams); } // 在你的加密方法前先调用该方法 CreateExportableKeyContainer("RobinsKeys"); toggleProtectionSleutelsConfig();
这样,当你调用ProtectSection("RSA")时,会使用已经标记为可导出的密钥容器,后续的导出命令就能正常执行。
补充说明
你之前遇到的Key not valid for use in specified state错误,本质是因为默认情况下,代码或配置未指定可导出属性时,创建的RSA密钥容器是不可导出的。通过上述两种方式设置导出标志,就能解决这个问题。
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

