You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

遗留ASP.NET环境中aspnet_regiis加密突然失效问题求助

解决ASP.NET跨服务器web.config加密「Failure to decode OAEP padding」问题

针对你遇到的跨服务器web.config加密失效、OAEP padding解码失败的问题,结合已做的排查操作,给出以下针对性解决步骤:

1. 强制统一RSA加密的哈希算法

不同Windows版本(Windows 10 22H2和Server 2016)的默认RSA哈希算法可能存在差异,会导致相同密钥容器下加密的CipherValue不一致。必须在所有环境的web.config中明确指定哈希算法和OAEP配置,确保加密逻辑完全统一:

<configProtectedData>
  <providers>
    <add name="RsaProtectedConfigurationProvider" 
         type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
         keyContainerName="你的共享密钥容器名称" 
         useMachineContainer="true"
         useOAEP="true"
         hashAlgorithm="SHA256" /> <!-- 所有环境必须统一此值,比如SHA1或SHA256,与历史加密配置一致 -->
  </providers>
</configProtectedData>

2. 锁定部署流程使用的aspnet_regiis版本

不同.NET Framework版本的aspnet_regiis可能存在加密逻辑差异,确保部署流程中调用的是与服务器一致的版本(比如.NET 4.8对应的aspnet_regiis)。直接使用完整路径调用,避免系统默认版本的不确定性:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -pef "connectionStrings" "你的应用目录路径"

3. 重新同步密钥容器(带明确参数)

即使已重新导入密钥,也可能因导入参数不完整导致密钥容器属性在不同服务器上不一致。按以下步骤重新生成并同步:

  • 在一台基准机器生成可导出的密钥容器:
    aspnet_regiis.exe -pc "你的共享密钥容器名称" -exp
    
  • 导出包含私钥的密钥文件:
    aspnet_regiis.exe -px "你的共享密钥容器名称" "C:\shared-key.xml" -pri
    
  • 在所有目标服务器导入密钥:
    aspnet_regiis.exe -pi "你的共享密钥容器名称" "C:\shared-key.xml"
    
  • 给应用池身份分配密钥容器的读取权限:
    aspnet_regiis.exe -pa "你的共享密钥容器名称" "IIS AppPool\你的应用池名称"
    

4. 排查Windows更新带来的加密API变更

问题集中在两天前出现,大概率和近期Windows更新有关。检查所有服务器和部署机器是否安装了涉及加密组件(CryptoAPI、.NET Framework)的KB补丁:

  • 在测试环境回滚可疑补丁,验证是否为补丁导致的加密行为变更;
  • 若无法回滚,根据补丁文档调整加密配置(比如强制指定哈希算法)适配新逻辑。

5. 用代码直接验证加密一致性

排除aspnet_regiis命令行的干扰,用C#代码直接调用.NET加密API测试:

using System.Configuration;

class ConfigEncryptionTest
{
    static void Main()
    {
        var configPath = @"C:\test-web.config";
        var config = ConfigurationManager.OpenExeConfiguration(configPath);
        var connStrings = config.GetSection("connectionStrings") as ConnectionStringsSection;
        
        if (!connStrings.SectionInformation.IsProtected)
        {
            connStrings.SectionInformation.ProtectSection("RsaProtectedConfigurationProvider");
            config.Save(ConfigurationSaveMode.Modified);
            System.Console.WriteLine("加密完成,检查CipherValue");
        }
    }
}

在所有服务器运行此代码,若加密后的CipherValue一致,说明问题出在aspnet_regiis命令行调用方式;若仍不一致,需重新检查密钥容器同步和配置的统一性。

内容的提问来源于stack exchange,提问作者David W

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 09:36:20