Флаг forceceFIPSPolicy в web.config не работает для веб-приложения - PullRequest
10 голосов
/ 11 июля 2011

Я пытаюсь настроить веб-приложение для работы в среде, где 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;
    }

И вот что я вижу, когда посещаю страницу:

screenshot of YSOD

Так что это приноситна пару вопросов:

  • Почему IIS выдает YSOD вместо того, чтобы мое приложение перехватывало исключение?
  • Что мне нужно сделать, чтобы мое веб-приложение моглоиспользовать <enforceFIPSPolicy enabled="false"/>?

Ответы [ 4 ]

6 голосов
/ 11 июля 2011

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

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

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

2). Я не уверен, почему ваш флаг игнорируется. Так не должно быть. Я отредактирую, если что-нибудь выясню.

Обратите внимание, что MD5CryptoServiceProvider все еще может бомбить. MD5 не является FIPS-совместимым хешем. Насколько я знаю; в .NET используются только алгоритмы хэширования SHA-1 и SHA-2. Крипто-функции, оканчивающиеся на CryptoServiceProvider, полагаются на CSP Windows; который также признает этот флаг. Альтернативой может быть использование BouncyCastle вместо реализации .NET, так как он не заботится об этом флаге.

2 голосов
/ 11 июля 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.Перезапустите службу информационных служб Интернета (IIS).Для этого выполните в командной строке следующую команду: iisreset

1 голос
/ 05 сентября 2017

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

0 голосов
/ 11 июля 2018

Так что, хотя это старое, оно все еще немного актуально. Настройка

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

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

...