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; }
这就是我访问页面时看到的内容:
所以这提出了几个问题:
- 为什么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的实现,因为它不关心那个标志。
我想你需要更新一些文件。 从这里开始
- 转到C:\ Program Files \ Common Files \ Microsoft Shared \ DevServer \ 9.0或包含WebDev.WebServer.Exe的任何文件夹
- 创建一个名为“WebDev.WebServer.Exe.config”的文本文件。确保扩展名为“config”而不是“txt”。
-
将以下文本添加到该文件中。
-
如果ASP.NET Development Server正在运行,请将其停止。 您可以通过右键单击系统托盘中的图标并选择“停止”来执行此操作。
- 转到
C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\
或任何包含devenv.exe.config的文件夹。 -
将以下行添加到devenv.exe.config的运行时部分。
-
如果Visual Studio已打开,请将其关闭并再次打开。
一些额外的事情要尝试
-
仔细检查您的Web.config中没有。 设置调试编译时,.NET使用MD5哈希进行内部簿记。 MD5不符合FIPS,因此您会收到此错误。
-
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不是应用程序配置文件。