“无法打开RSA密钥容器”即使在ACL权限之后也会出错(对于某些用户)

时间:2012-02-17 10:30:40

标签: c# asp.net iis iis-7 windows-server-2008

应用加密时,我们收到以下错误(在asp.net网站上)。

分析程序错误消息:无法使用提供程序“RsaProtectedConfigurationProvider”进行解密。来自提供程序的错误消息:无法打开RSA密钥容器。

注意:请参阅我们遵循的下列步骤。 (我们已经在NetFrameworkConfigurationKey上授予NT Authority \ Network Service的ACL权限)

注意:我们在 IIS7 中启用了Windows身份验证并启用了ASP.NET模拟。它在 Windows Server 2008 中运行。根据用户是否属于允许的AD组(将在配置文件中列出)来控制访问。

有趣的是,当group1(来自location1)的用户访问它时会发生此错误。当group2的用户(来自locatiob2)尝试访问它时,错误不会出现。

有关如何纠正它的任何想法?

我们已从部署文档中按照下列步骤进行操作。

  1. 以管理员模式运行命令窗口。 (在Windows Server 2008中,键入cmd并按CTRL + SHIFT + ENTER)
  2. 使用更改目录命令(cd)转到文件夹C:\ Windows \ Microsoft.Net \ Framework \ v4.0.30319 \。
  3. 键入以下命令以创建RSA密钥容器。 aspnet_regiis -pc“NetFrameworkConfigurationKey”-exp
  4. 键入以下内容(添加用于访问RSA密钥容器的ACL)并按Enter aspnet_regiis -pa“NetFrameworkConfigurationKey”“NT Authority \ Network Service”
  5. 键入以下内容(在将突出显示的文本替换为部署服务的位置之后),然后按Enter键加密Service的Web.Config中的连接字符串。 aspnet_regiis.exe -pef“connectionStrings”“C:\ MyWCF \ ServiceName”
  6. 键入以下内容(在将突出显示的文本替换为部署网站的位置之后),然后按Enter键加密网站Web.Config中的连接字符串。 aspnet_regiis.exe -pef“connectionStrings”“C:\ MyWeb \ WebsiteName”
  7. 键入以下内容(在将突出显示的文本替换为网站的web.config文件可用的位置之后),然后按Enter键加载Website的Web.Config中的sessionState值。 aspnet_regiis.exe -pef“system.web / sessionState”“C:\ MyWeb \ WebsiteName”
  8. 验证连接字符串和SessionState值是否已加密。
  9. 验证Machine.Config中configProtectedData部分中的以下详细信息。
  10. •验证defaultProvider =“RsaProtectedConfigurationProvider”

    •验证keyContainerName =“NetFrameworkConfigurationKey”

    注意:machine.config的默认位置是C:\ WINDOWS \ Microsoft.NET \ Framework \ v4.0.30319 \ Config

3 个答案:

答案 0 :(得分:9)

以下是我尝试过的一种不涉及机器配置的方法。

注意:如果目标位于Windows Sever 2008中,则需要在Windows Server 2008本身中执行加密步骤。

在服务器A中执行以下代码

注意: - 注册密钥

 cd C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319
 aspnet_regiis.exe -pc "MyProjectKeys" -exp

注意: - 仅在服务器A上授予访问权限

aspnet_regiis.exe -pa "MyProjectKeys" "IIS APPPOOL\testpsreloservices"
aspnet_regiis.exe -pa "MyProjectKeys" "NT AUTHORITY\NETWORK"

包含RSA密钥的导出XML文件

aspnet_regiis.exe -px "MyProjectKeys" E:\wmapps\webroot\myservice\MyProjectKey.xml –pri

在web.config中添加了以下内容

<configProtectedData>
  <providers>
    <clear/>
<remove name="RSAProtectedConfigurationProvider" />
     <add name="RSAProtectedConfigurationProvider" keyContainerName="MyProjectKeys" 
    type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0,&#xD;&#xA;                
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a,&#xD;&#xA; processorArchitecture=MSIL"
          useMachineContainer="true" />
  </providers>
</configProtectedData>

加密

aspnet_regiis -pef "connectionStrings" "E:\wmapps\webroot\myservice" -prov "RsaProtectedConfigurationProvider"

在B服务器中复制加密文件。 将密钥xml文件复制到B服务器。

使用以下命令创建批处理文件并执行(用于密钥注册和授予访问权限)

c:
cd C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319
aspnet_regiis.exe -pi "MyProjectKeys" E:\wmapps\webroot\myservice\MyProjectKey.xml
aspnet_regiis.exe -pa "MyProjectKeys" "IIS APPPOOL\testpsreloservices"
aspnet_regiis.exe -pa "MyProjectKeys" "NT AUTHORITY\NETWORK"

答案 1 :(得分:4)

如果您启用了模拟,则将使用访问应用程序的用户的身份访问RSA密钥容器,而不是网络服务。

您需要禁用模拟,或者将可以访问应用程序的所有用户添加到密钥容器的ACL中。

答案 2 :(得分:0)

就我而言,我已使用ASPNET_REGIIS对连接字符串进行了加密。我有最后一个应用程序,最后我进行了修改,以从旧服务器迁移到使用加密密钥的服务器。已经部署了此应用程序的较旧版本,但尚未使用。当我将最新版本部署(发布)到服务器时,我使用Replace方法而不是delete方法。我遇到此错误,并在这里偶然发现。没有一种解决方案对我有用。

我的修正: 所以我决定清除应用程序文件夹的内容,然后重新发布。

这样做可以解决我的问题。