0

我正在尝试在我们的 Windows 2008 R2 服务器上启用 TLS 1.2 以实现 PCI 合规性,并通过遵循这个需要打开 FIPS 验证的晦涩博客文章设法使其工作。最后,在寻找解决方案数周后,单击一次、.NET 远程处理和 MS Web Deploy 正在通过 TLS 1.2 进行通信。

但是,当我启用 FIPS 验证并出现以下错误时,我的机器上也有 Web 应用程序退出运行:

此实现不是 Windows 平台 FIPS 验证的加密算法的一部分。

说明:执行当前 Web 请求期间发生未处理的异常。请查看堆栈跟踪以获取有关错误及其源自代码的位置的更多信息。

异常详细信息: System.InvalidOperationException:此实现不是 Windows 平台 FIPS 验证的加密算法的一部分。

源错误:

在执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪来识别有关异常起源和位置的信息。

堆栈跟踪:

[InvalidOperationException:此实现不是 Windows 平台 FIPS 验证的加密算法的一部分。] System.Security.Cryptography.RijndaelManaged..ctor() +10489630 System.Web.Configuration.MachineKeySection.ConfigureEncryptionObject() +439 System.Web.Configuration .MachineKeySection.EnsureConfig() +152 System.Web.Configuration.MachineKeySection.HashData(Byte[] buf, Byte[] 修饰符, Int32 开始, Int32 长度) +48 System.Web.Configuration.MachineKeySection.HashAndBase64EncodeString(String s) + 136 System.Web.SessionState.OutOfProcSessionStateStore.OneTimeInit() +763 System.Web.SessionState.OutOfProcSessionStateStore.Initialize(字符串名称,NameValueCollection 配置)+223 System.Web.SessionState.OutOfProcSessionStateStore.Initialize(字符串名称,NameValueCollection 配置,IPartitionResolver partitionResolver) +43 System.Web.SessionState.SessionStateModule.InitModuleFromConfig(HttpApplication app, SessionStateSection config) +11279756 System.Web.SessionState.SessionStateModule.Init(HttpApplication app) +155 System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext, HttpContext上下文,MethodInfo[] 处理程序)+480 System.Web.HttpApplication.InitSpecial(HttpApplicationState 状态,MethodInfo[] 处理程序,IntPtr appContext,HttpContext 上下文)+336 System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext,HttpContext 上下文)+350 系统.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext) +382SessionStateSection 配置)+11279756 System.Web.SessionState.SessionStateModule.Init(HttpApplication 应用程序)+155 System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext,HttpContext 上下文,MethodInfo[] 处理程序)+480 System.Web.HttpApplication.InitSpecial(HttpApplicationState状态,MethodInfo[] 处理程序,IntPtr appContext,HttpContext 上下文)+336 System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext,HttpContext 上下文)+350 System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext)+382SessionStateSection 配置)+11279756 System.Web.SessionState.SessionStateModule.Init(HttpApplication 应用程序)+155 System.Web.HttpApplication.RegisterEventSubscriptionsWithIIS(IntPtr appContext,HttpContext 上下文,MethodInfo[] 处理程序)+480 System.Web.HttpApplication.InitSpecial(HttpApplicationState状态,MethodInfo[] 处理程序,IntPtr appContext,HttpContext 上下文)+336 System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext,HttpContext 上下文)+350 System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext)+382InitSpecial(HttpApplicationState 状态,MethodInfo[] 处理程序,IntPtr appContext,HttpContext 上下文)+336 System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext,HttpContext 上下文)+350 System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext)+382InitSpecial(HttpApplicationState 状态,MethodInfo[] 处理程序,IntPtr appContext,HttpContext 上下文)+336 System.Web.HttpApplicationFactory.GetSpecialApplicationInstance(IntPtr appContext,HttpContext 上下文)+350 System.Web.Hosting.PipelineRuntime.InitializeApplication(IntPtr appContext)+382

[HttpException (0x80004005):此实现不是 Windows 平台 FIPS 验证的加密算法的一部分。] System.Web.HttpRuntime.FirstRequestInit(HttpContext context) +11421094 System.Web.HttpRuntime.EnsureFirstRequestInit(HttpContext context) +88 System.Web .HttpRuntime.ProcessRequestNotificationPrivate(IIS7WorkerRequest wr, HttpContext context) +4405316

版本信息:Microsoft .NET Framework 版本:2.0.50727.5485;ASP.NET 版本:2.0.50727.5491

我将 ASP.NET 状态服务与所有 3 个应用程序一起使用,并且它们正在获取此堆栈跟踪。

我已经四处寻找解决方案,他们基本上都说将算法切换到符合 FIPS 的算法。

但是既然这是由 ASP.NET 本身抛出的,那么解决方案是什么?我正在使用 .NET 3.5,升级到更新的框架会解决问题吗?还是有更简单的解决方法,例如配置设置?

注意:我还尝试使用绕过此错误的进程内会话状态,然后在使用 cookie 加密时遇到相同的错误(显然也在使用System.Security.Cryptography.RijndaelManaged)。我尝试将机器密钥设置为此处示例中的密钥(用于测试),并将其与 AES 结合作为解密和验证设置,但它对错误消息没有任何影响。

4

1 回答 1

0

以下更改适用于我的情况......

  1. 在 Windows 注册表中启用 TLS 协议。请参阅IIS 7.5:如何启用 TLS 1.1 和 TLS 1.2
  2. 在应用程序代码中,在应用程序启动时添加以下代码行(例如,Application_Start对于 a System.Web.Http.Application

    System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;

于 2016-04-19T13:31:32.927 回答