Флаг enforceFIPSPolicy в web.config, похоже, не работает для веб-приложения

Я пытаюсь настроить веб-приложение для работы в среде, где FIPSAlgorithmPolicy установлен на 1 в реестре Windows (в частности, 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

На основании того, что я прочитал в в этой статье, вы должны иметь возможность добавить в файл конфигурации следующее, чтобы отключить проверку алгоритма:

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

У меня это работает в тестовом консольном приложении, изменив его app.config. Однако это не работает при изменении файла web.config веб-приложения .NET 2.0.

Что меня интересует, так это то, что, хотя я перехватываю все исключения, когда я создаю экземпляр MD5CryptoServiceProvider в коде, похоже, он даже не попадает в эту часть моего кода. Это код, который вызывается в моем тестовом приложении:

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

person Ben McCormack    schedule 11.07.2011    source источник
comment
Это работает для отключения проверки FIP для определенного пула приложений.   -  person A P    schedule 22.08.2018


Ответы (4)


1). Ваш код не генерирует исключение. ASP.NET делает что-то еще. ASP.NET пытается сериализовать ViewState; который может быть зашифрован машинным ключом. Когда ASP.NET делает это внутренне; он использует класс RijndaelManaged (который не соответствует стандарту FIPS 140; и взрывается. Точно так же; когда ASP.NET пытается зашифровать / расшифровать билет проверки подлинности с помощью форм, он также будет использовать машинный ключ.

У вас есть несколько вариантов решения проблемы с машинным ключом. Вы можете использовать 3DES (который всегда будет использовать реализацию, совместимую с FIPS, установив MachineKey в вашем web.config, чтобы он выглядел так:

<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, поскольку этот флаг не заботит.

person vcsjones    schedule 11.07.2011
comment
Отличный ответ! Флаг в конфиге должен работать с MD5CryptoServiceProvider. По крайней мере ... он должен в том смысле, что он работает, чтобы разрешить этот класс при использовании в консольном приложении. - person Ben McCormack; 11.07.2011
comment
Хорошо, теперь я кое-что получу. Добавление ключевого элемента машины позволяет мне передать YSOD в мое приложение. Однако исключение все еще генерируется. - person Ben McCormack; 11.07.2011
comment
@Ben: Это действительно система MD5CryptoServiceProvider сейчас бомбит? - person vcsjones; 11.07.2011
comment
это правильно. Я получаю это от e.ToString(): System.InvalidOperationException: This implementation is not part of the Windows Platform FIPS validated cryptographic algorithms. at System.Security.Cryptography.MD5CryptoServiceProvider..ctor() at TestCryptoAspNet._Default.printSomething() in C:\code\TestCryptoAspNet\TestCryptoAspNet\Default.aspx.cs:line 23 - person Ben McCormack; 11.07.2011
comment
@Ben - Я до сих пор не понимаю, почему игнорируют ваш флаг. На данный момент мое единственное предложение - использовать BouncyCastle. - person vcsjones; 11.07.2011

Думаю нужно обновить еще несколько файлов. Из здесь

  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 запущен, остановите его. Вы можете сделать это, щелкнув правой кнопкой мыши его значок на панели задач и выбрав Остановить.

  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 не является частью криптографических алгоритмов, проверенных FIPS платформы Windows. Чтобы решить эту проблему, вы можете указать другой алгоритм в своем 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 Information Services (IIS). Для этого выполните в командной строке следующую команду: iisreset

person SwDevMan81    schedule 11.07.2011
comment
Это верно, если вы используете Cassini в качестве веб-сервера. Тем не мение; в вопросе говорится, что используется IIS. Я не совсем уверен, почему потребуется изменение политики Visual Studio; или. - person vcsjones; 11.07.2011
comment
@vcsjones - Ага, ты прав. Похоже, проблема связана с ASP, использующим RijndaelManaged для обработки данных состояния просмотра. Исправление будет заключаться в том, чтобы изменить его на 3DES, как предлагается. - person SwDevMan81; 11.07.2011
comment
Так что, на самом деле, мне нравится избегать изменения конфигураций в файлах, которые VS будет использовать локально (например, devenv.exe.config и WebDev.WebServer.Exe.config), если я не знаю, какие файлы нужно будет изменить на сервере, чтобы запустить мое приложение и там. Этот ответ можно улучшить, указав те файлы и пути, которые потребуется обновить на сервере, или объяснив, что там не будет никаких необходимых изменений, кроме обновления web.config, и почему это необходимо на рабочей станции, на которой запущено приложение. локально в VS, а не на сервере. - person vapcguy; 24.06.2016

Как вы обнаружили, запись web.config не работает, по крайней мере, в iis 7.5 forward. Вместо этого вам необходимо использовать файл конфигурации пула приложений, как описано в здесь

person Elroy Flynn    schedule 05.09.2017

Так что, даже несмотря на то, что это старый, он все же немного актуален. Настройки

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

находится в aspnet.config в папках Framework и / или Framework64 .net. Этот параметр обхода работает с файлом конфигурации приложения. Web.config не является файлом конфигурации приложения.

person John Boats    schedule 11.07.2018