Шифрование Web.Config с использованием RsaProtectedConfigurationProvider - ошибка "Bad Data"

Я пытаюсь зашифровать значения строки соединения в файле Web.Config для веб-приложения ASP.NET 2.0, следуя процедуре описанной в MSDN. Используя RsaProtectedConfigurationProvider, я создал и экспортировал ключ машинного уровня на моей машине разработки (используя флаг -pri) и импортировал ключ и предоставил доступ на веб-сервере. Перед тестированием автоматического дешифрования ASP.NET я хотел попробовать вручную дешифровать Web.Config.

Я могу вручную зашифровать и дешифровать Web.Config на том же компьютере, используя параметры -pef и -pdf соответственно, но с помощью машинного сообщения с ошибкой Bad Data происходит ручное дешифрование на веб-сервере.

Самое странное, что атрибут keyContainerName в моем файле Web.Config, кажется, игнорируется. Если я попытаюсь заменить правильное значение талисманом (больше не соответствующим какому-либо ключевому контейнеру, который я создал), шифрование и дешифрование все еще работают на моей машине разработки. Любые идеи?

Ответы

Ответ 1

Из вашего описания вы сталкиваетесь с некоторыми проблемами, связанными с encypting web.config через экспортируемый поставщик RSA, правильно?

В соответствии с ссылкой на RSA-шифрование, я выполнил некоторые локальные тесты, нормальный процесс шифрования раздела web.config через поставщика RSA и перейдите на другую машину, как показано ниже:

====================== Шаг 1

Создайте контейнер ключа RSA на уровне машины: aspnet_regiis -pc "MyTestKeys" -exp

Шаг 2

Предоставление доступа к ключам шифрования RSA:

aspnet_regiis -pa "MyTestKeys" "NT AUTHORITY\NETWORK SERVICE"

Шаг 3

Зашифровать файл конфигурации: aspnet_regiis -pef "connectionStrings" "физический путь веб-сайта папка "-prov MyRSAProvider

экспортируйте контейнер и импортируйте его обратно на другую машину, используя следующие шаги

Шаг 4

Экспортировать контейнер ключа RSA на уровне машины: aspnet_regiis -px "MyTestKeys" "c:\Config-Key.xml" -pri

Шаг 5

Скопируйте Config-Key.xml в c:\на 2-й сервер

Шаг 6

Импортируйте контейнер ключа RSA на уровне машины на 2-й сервер: aspnet_regiis -pi "MyTestKeys" "c:\Config-Key.xml"

Шаг 7

Предоставление доступа к ключам шифрования RSA: aspnet_regiis -pa "MyTestKeys" "NT AUTHORITY\NETWORK SERVICE"

Шаг 8

Скопировать зашифрованный web.config на второй сервер

========================

Основываясь на описанных выше шагах, я думаю, что большая часть процесса, который у вас есть Следование должно быть правильным. До сих пор я хотел бы предложить вам проверить следующие вещи:

  • Проверьте настройку поставщика услуг RSA, чтобы убедиться, что он правильно скопирован на целевую машину и настроен на использование контейнера Machine

======== шифровать конфигурационный раздел =======        

тип = "System.Configuration.RsaProtectedConfigurationProvider, System.Configur , версия = 2.0.0.0, Культура = нейтраль, PublicKeyToken = b03f5f7f11d50a3a "/" >   

  1. AS в приведенных выше шагах, после создания контейнера ключей RSA, вам нужно используйте "aspnet_regiis -pa", чтобы убедиться, что определенная учетная запись (которая будет запустите приложение ASP.NET) имеет достаточные права доступа к ключевой контейнер. Как правило, при использовании тестового сервера VS 2008/VS 2005 для запуска ASP.NET, вы используете пользователя входа в систему (который, вероятно, admin), однако, если вы запустите ASP.NET в IIS (или после перехода на другой сервер, который использует другую учетную запись процесса), вам нужно сделать убедитесь, что определенному учету процесса предоставлено разрешение.

Вы можете проверить их, чтобы узнать, связана ли проблема с некоторыми из них.

С уважением, Санджай Манджу суман

Ответ 2

Будьте осторожны, что имя элемента для шифрования чувствительно к регистру. Поэтому вы должны использовать "connectionStrings" не "connectionstrings" или "ConnectionStrings".

Ответ 3

Я выполнил описанный ниже подход, когда у меня была ошибка Bad Data при ручном расшифровке.

  • Добавьте теги Remove и Clear в configProtectedData.
  • Verify –pri использовался при экспорте ключа
  • Также убедитесь, что keyContainerName является тем же, что и для реестров

keyContainerName = "MyKeys"

CONFIG

<configProtectedData>
  <providers>

    <clear/>

<remove name="RSAProtectedConfigurationProvider" />

     <add name="RSAProtectedConfigurationProvider" keyContainerName="MyKeys" 
    type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0,&#xD;&#xA;                
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a,&#xD;&#xA; processorArchitecture=MSIL"
          useMachineContainer="true" />

  </providers>
</configProtectedData>

ССЫЛКА

Ответ 4

На самом деле вы можете использовать EL от Microsoft только для шифрования вашей строки подключения. Вы можете скачать его здесь: http://www.codeplex.com/entlib

HTH

Ответ 5

RsaProtectedConfigurationProvider использует учетную запись компьютера или учетную запись пользователя для шифрования ключей и сохранения их в файле, который называется "контейнер ключей", который обычно сохраняется в C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA. И идентификатор рабочего процесса ASP.NET(пользователь ASPNET в XP/2000 или Network Service в случае 2003) должен иметь доступ к этим файлам, чтобы иметь возможность расшифровать его, или вы получите это сообщение об ошибке.

Пожалуйста, проверьте эту ссылку для получения дополнительной информации

http://msdn.microsoft.com/en-us/library/dtkwfdky.aspx

Ответ 6

Encrpyting очень чувствительна к регистру, как сказал махди. Я использовал в своем компьютере и взял его на разлом. У меня возникла проблема, связанная с контейнерами ключей машины RSA, которые хранятся в папке или папке ПК. и Если вы хотите знать, где можно начать коррекцию, прежде чем вносить какие-либо изменения, просто начните с

\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA\MachineKeys.

Для информации, любезно предоставите ссылку, которая может быть полезной....

http://msdn.microsoft.com/en-us/library/ms998283.aspx

Ответ 7

Это еще один способ зашифровать и дешифровать строку coonection. если вы используете vs2010, тогда откройте vs2010, запустите его как администратор

string provider = "RSAProtectedConfigurationProvider";

string section = "connectionStrings"; 

protected void btnEncrypt_Click(object sender, EventArgs e) 

{

   Configuration confg =
   WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);

   ConfigurationSection configSect = confg.GetSection(section);

   if (configSect != null)

   {
      configSect.SectionInformation.ProtectSection(provider);
      confg.Save();

   }

}
protected void btnDecrypt_Click(object sender, EventArgs e)
{
    Configuration config =
        WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
    ConfigurationSection configSect = config.GetSection(section);
    if (configSect.SectionInformation.IsProtected)
    {
        configSect.SectionInformation.UnprotectSection();
        config.Save();
    }
}