C# web.config中的EnforceFipPolicy标志不';我似乎无法为web应用程序工作

C# web.config中的EnforceFipPolicy标志不';我似乎无法为web应用程序工作,c#,.net,asp.net,iis,fips,C#,.net,Asp.net,Iis,Fips,我正在尝试设置一个web应用程序,使其在Windows注册表(特别是HKLM/SYSTEM/CurrentControlSet/Control/Lsa)中将FIPSAlgorithmPolicy设置为1的环境中工作。启用此标志时,对类MD5CryptoServiceProvider的任何调用都将导致引发无效操作异常,并引发以下堆栈跟踪: [InvalidOperationException: This implementation is not part of the Windows Platf

我正在尝试设置一个web应用程序,使其在Windows注册表(特别是HKLM/SYSTEM/CurrentControlSet/Control/Lsa)中将
FIPSAlgorithmPolicy
设置为
1
的环境中工作。启用此标志时,对类
MD5CryptoServiceProvider
的任何调用都将导致引发
无效操作异常
,并引发以下堆栈跟踪:

[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>
这就是我访问页面时看到的:

这就引出了几个问题:

  • 为什么IIS会抛出YSOD而不允许我的应用捕获异常
  • 我需要做什么才能使我的web应用程序能够使用
    • 1)。您的代码没有引发异常。ASP.NET正在做其他事情。ASP.NET正在尝试序列化ViewState;可以通过机器密钥对其进行加密。当ASP.NET在内部执行此操作时;它使用
      RijndaelManaged
      类(该类不符合FIPS 140;并且会爆炸。同样,当ASP.NET尝试加密/解密表单身份验证票证时,它也会使用机器密钥

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

      <machineKey validationKey="AutoGenerate,IsolateApps" decryptionKey="AutoGenerate,IsolateApps" validation="3DES" decryption="3DES" />
      
      
      
      2) .我不知道为什么你的标志会被忽略。它不应该被忽略。如果我发现了什么,我会编辑它


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

      我认为您需要更新更多的文件

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

      
      

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

    • 转到
      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平台FIPS验证的加密算法的一部分。要解决此问题,您可以使用以下行在web.config中指定其他算法:

    • 它还通过MSFT确认您收到了相同的错误。要修复此错误,请执行以下操作:

      在文本编辑器(如记事本)中,打开应用程序级别的Web.config文件。 在Web.config文件中,找到该节。 将以下章节添加到章节中的:

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


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

      因此,即使它是旧的,它仍然有点相关。设置

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

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

      如果将Cassini用作Web服务器,则是这样。但是,问题表明正在使用IIS。我不完全确定为什么要更改Visual Studio的policy是必需的;或者。@vcsjones-是的,你是对的。问题似乎与ASP使用RijndaelManaged处理视图状态数据有关。修复方法是按照建议将其更改为3DE。因此,实际上,我希望避免仅在VS本地使用的文件中更改配置(如
      devenv.exe.config
      WebDev.WebServer.exe.config
      ),除非我知道运行我的应用程序需要在服务器上更改哪些文件,否则也可以在那里更改。这个答案可以通过提供服务器上需要更新的文件和路径来改进,或者解释除了web.config更新之外,那里没有任何需要的更改,以及为什么在运行ap的工作站上需要更改p在VS中本地,但不是服务器。回答得很好!配置中的标志应该与
      MD5CryptoServiceProvider
      一起使用。至少……它应该在允许在控制台应用程序中使用该类的意义上起作用。好的,现在我有点进展了。添加机器键元素可以让我通过YSOD并进入我的应用程序。异常但仍被抛出。@Ben:现在实际轰炸的是MD5CryptoServiceProvider吗?没错。我是从
      e.ToString()
      得到这个消息的
      
      `<machineKey validationKey="AutoGenerate,IsolateApps" decryptionKey="AutoGenerate,IsolateApps" validation="3DES" decryption="3DES"/>`
      
      <configuration>
         <runtime>
            <enforceFIPSPolicy enabled="false" />
         </runtime>
      </configuration>