我们想要加密我们部署到服务器的所有 Web 应用程序配置文件。我们更愿意将此作为构建过程中的一个步骤,并将预加密文件包含在 MSI 中。
这意味着我们的构建服务器(加密器)和生产服务器(解密器)需要相同的密钥。所以我现在正在尝试做一个非常基本的测试。在 MachineA 上加密 Web.Config - 在 MachineB 上解密它。这是我到目前为止尝试过的测试
在我的本地电脑上创建一个新的 RSA 密钥对容器。
aspnet_regiis -pc "MyContainer" -exp
向我和 NetworkService 用户授予 ACL 权限。
aspnet_regiis -pa "MyContainer" "MyDomain\My.Account"
aspnet_regiis -pa "MyContainer" "NT AUTHORITY\NETWORK SERVICE"
将该密钥对导出到 xml 文件
aspnet_regiis -px "MyContainer" C:\MyContainer.xml -pri
将该文件复制到另一台电脑并导入它
aspnet_regiis -pi "MyContainer" C:\MyContainer.xml
授予我的同事和他的机器对新导入文件的 NetworkService 用户权限
aspnet_regiis -pa "MyContainer" "MyDomain\My.Colleague"
aspnet_regiis -pa "MyContainer" "NT AUTHORITY\NETWORK SERVICE"
接下来,我在本地机器上创建了一个非常简单的 web.config。
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="SecretKey" value="ValueWeWantToHide" />
</appSettings>
<configProtectedData>
<providers>
<add name="SampleProvider"
type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
keyContainerName="MyContainer"
useMachineContainer="true" />
</providers>
</configProtectedData>
</configuration>
我可以很容易地在此处使用命令加密和解密 appSettings 部分。他们成功加密和解密,加密后的加密部分被标记为正确的提供者(<appSettings configProtectionProvider="RsaProtectedConfigurationProvider">
)
aspnet_regiis -pef appSettings D:\testapp
and
aspnet_regiis -pdf appSettings D:\testapp
但是,当我将加密的 web.config 复制到我的同事 PC 并尝试使用上面的命令对其进行解密时,解密失败。它给出了一个非常无用的错误
Failed to decrypt using provider 'RSAProtectedConfigurationProvider'. Error message from provider: Bad Data
现在我被困住了。我在 SO 上发现了几个类似的问题,但没有具体解决他们的问题的具体问题。我是否在某个地方错过了一步。我假设我的密钥设置是有效的,因为我可以在本地加密/解密。是否有可能我已经启动了密钥导入或错过了我同事机器上的某些步骤。任何帮助表示赞赏。