10

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

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

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

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

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

    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 而不是让我的应用程序捕获异常?
  • 我需要做什么才能使我的网络应用程序能够使用<enforceFIPSPolicy enabled="false"/>
4

4 回答 4

8

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 的实现,因为它不关心该标志。

于 2011-07-11T16:01:37.350 回答
2

我认为您需要更新更多文件。从这里

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

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

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

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

    <enforceFIPSPolicy enabled=”0” />

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

一些额外的尝试

  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"/>

它还通过 MSFT在此处确认您收到相同的错误。要解决这个问题:

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

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

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

于 2011-07-11T16:02:43.397 回答
1

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

于 2017-09-05T20:31:29.187 回答
0

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

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

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

于 2018-07-11T15:18:20.737 回答