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

时间:2011-07-11 15:48:07

标签: c# .net asp.net iis fips

我正在尝试设置一个Web应用程序,以便在Windows注册表中FIPSAlgorithmPolicy设置为1的环境中工作(特别是HKLM / SYSTEM / CurrentControlSet / Control / Lsa) 。启用此标志后,对类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

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

<configuration>
    <runtime>
        <enforceFIPSPolicy enabled="false"/>
    </runtime>
</configuration>

通过修改app.config,我可以在测试控制台应用程序中使用它。但是,在修改.NET 2.0 Web应用程序的web.config。

时,它似乎不起作用

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

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

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

screenshot of YSOD

所以这提出了几个问题:

  • 为什么IIS会抛出YSOD而不是让我的应用程序捕获异常?
  • 我需要做什么才能使我的网络应用能够使用<enforceFIPSPolicy enabled="false"/>

4 个答案:

答案 0 :(得分:6)

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

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

<machineKey validationKey="AutoGenerate,IsolateApps" decryptionKey="AutoGenerate,IsolateApps" validation="3DES" decryption="3DES" />

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

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

答案 1 :(得分:2)

我认为您需要更新更多文件。来自here

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

    <configuration> <runtime> <enforceFIPSPolicy enabled="0" /> </runtime> </configuration>

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

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

    <enforceFIPSPolicy enabled=”0” />

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

  8. Some addition things to try

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

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

    3. 它还通过MSFT确认here您得到了同样的错误。解决它:

        

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

      `<machineKey validationKey="AutoGenerate,IsolateApps" decryptionKey="AutoGenerate,IsolateApps" validation="3DES" decryption="3DES"/>`
      
        

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

答案 2 :(得分:1)

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

所述

答案 3 :(得分:0)

因此,即使它很旧,它仍然有些相关。设置

<configuration>
   <runtime>
      <enforceFIPSPolicy enabled="false" />
   </runtime>
</configuration>

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