web.config中的enforceFIPSPolicy标志似乎不适用于Web应用程序

我正在尝试设置一个Web应用程序,以便在Windows注册表中将FIPSAlgorithmPolicy设置为1的环境中工作(特别是HKLM / SYSTEM / CurrentControlSet / Control / Lsa)。 启用此标志后,对MD5CryptoServiceProvider类的任何调用MD5CryptoServiceProvider将导致使用以下堆栈跟踪抛出Invalid Operation Exception

 [InvalidOperationException: This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms.] System.Security.Cryptography.RijndaelManaged..ctor() +10480142 System.Web.Configuration.MachineKeySection.ConfigureEncryptionObject() +439 System.Web.Configuration.MachineKeySection.EnsureConfig() +152 System.Web.Configuration.MachineKeySection.GetEncodedData(Byte[] buf, Byte[] modifier, Int32 start, Int32& length) +48 System.Web.UI.ObjectStateFormatter.Serialize(Object stateGraph) +381 System.Web.UI.Util.SerializeWithAssert(IStateFormatter formatter, Object stateGraph) +59 System.Web.UI.HiddenFieldPageStatePersister.Save() +89 System.Web.UI.Page.SaveAllState() +1117 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3864 

根据我在本文中读到的内容 ,您应该能够将以下内容添加到配置文件中以禁用算法检查:

      

这通过修改其app.config在测试控制台应用程序中适用于我。 但是,当修改.NET 2.0 Web应用程序的web.config时,它似乎不起作用。

对我来说有趣的是,即使我在代码中实例化MD5CryptoServiceProvider时仍然捕获所有exception,但它似乎甚至没有进入我的代码部分。 这是我的测试应用程序中调用的代码:

  protected string printSomething() { string toPrint = String.Empty; try { MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider(); toPrint = "Created algorithm."; } catch (Exception e) { toPrint = e.ToString(); } return toPrint; } 

这就是我访问页面时看到的内容:

YSOD的截图

所以这提出了几个问题:

  • 为什么IIS抛出YSOD而不是允许我的应用程序捕获exception?
  • 我需要做什么才能使我的网络应用能够使用

1)。 您的代码不会抛出exception。 ASP.NET正在做其他事情。 ASP.NET正在尝试序列化ViewState; 可以通过机器密钥加密。 当ASP.NET在内部执行此操作时; 它使用RijndaelManaged类(不符合FIPS 140;并且爆炸。同样;当ASP.NET尝试加密/解密表单身份validation票证时;它也将使用机器密钥。

您有一些机器密钥问题的选项。 您可以使用3DES(通过将web.config中的MachineKey设置为如下所示,它将始终使用符合FIPS的实现:

  

2)。 我不确定为什么你的旗子被忽略了。 它不应该。 如果我搞清楚,我会编辑。

请注意, MD5CryptoServiceProvider可能仍会炸弹。 MD5不是符合FIPS标准的哈希。 我所知道的; 只有SHA-1和SHA-2哈希算法在.NET中。 以CryptoServiceProvider结尾的加密函数依赖于Windows CSP; 这也承认了这面旗帜。 另一种方法是使用BouncyCastle而不是.NET的实现,因为它不关心那个标志。

我想你需要更新一些文件。 从这里开始

  1. 转到C:\ Program Files \ Common Files \ Microsoft Shared \ DevServer \ 9.0或包含WebDev.WebServer.Exe的任何文件夹
  2. 创建一个名为“WebDev.WebServer.Exe.config”的文本文件。确保扩展名为“config”而不是“txt”。
  3. 将以下文本添加到该文件中。

  4. 如果ASP.NET Development Server正在运行,请将其停止。 您可以通过右键单击系统托盘中的图标并选择“停止”来执行此操作。

  5. 转到C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\或任何包含devenv.exe.config的文件夹。
  6. 将以下行添加到devenv.exe.config的运行时部分。

  7. 如果Visual Studio已打开,请将其关闭并再次打开。

一些额外的事情要尝试

  1. 仔细检查您的Web.config中没有。 设置调试编译时,.NET使用MD5哈希进行内部簿记。 MD5不符合FIPS,因此您会收到此错误。

  2. ASP.NET 2.0在处理视图状态数据时使用AES算法的RijndaelManaged实现。 RijndaelManaged实施尚未得到美国国家标准与技术研究院(NIST)的认证,符合联邦信息处理标准(FIPS)。 因此,AES算法不是Windows平台FIPSvalidation的加密算法的一部分。 要解决此问题,您可以使用以下行在web.config中指定其他算法:

它也在MSFT中证实你得到了同样的错误。 要解决这个问题:

在记事本等文本编辑器中,打开应用程序级Web.config文件。 在Web.config文件中,找到该部分。 在以下部分中添加以下部分:

 `` 

保存Web.config文件。 重新启动Microsoft Internet信息服务(IIS)服务。 为此,请在命令提示符处运行以下命令:iisreset

正如您所发现的那样,web.config条目不起作用,至少在iis 7.5 forward中是这样。 相反,您需要使用应用程序池配置文件,如此处所述

所以,即使这是旧的,它仍然有点相关。 那个设定

      

进入Framework和/或Framework64 .net文件夹中的aspnet.config。 此旁路设置适用于应用程序配置文件。 Web.config不是应用程序配置文件。