Шифрование Web.Config с использованием RsaProtectedConfigurationProvider - ошибка «неверные данные» - PullRequest
15 голосов
/ 23 апреля 2009

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

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

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

Ответы [ 7 ]

7 голосов
/ 30 января 2010

Из вашего описания вы столкнулись с некоторыми проблемами при шифровании 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" "физический путь веб-сайта папка "-пров 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 на второй сервер

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

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

  1. Проверьте настройки своего собственного провайдера RSA, чтобы увидеть, правильно ли это также скопировано на целевой компьютер и настроено на использование контейнера Machine

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

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

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

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

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

1 голос
/ 31 мая 2013

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

  1. Добавьте Remove и Clear теги в configProtectedData.
  2. Убедитесь, что –pri использовался при экспорте ключа
  3. Также убедитесь, что 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>

ССЫЛКА

  1. ConnectionString Encryption
  2. Где находится ключ RAS ...
1 голос
/ 01 февраля 2010

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

0 голосов
/ 08 мая 2012

Это еще один способ зашифровать и расшифровать строку соединения. если вы используете 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();
    }
}
0 голосов
/ 02 февраля 2010

Шифрование очень чувствительно к регистру, как сказал Махди. Я использовал свой компьютер и перешел на сервер. У меня возникла проблема, проблема была связана с контейнерами ключей машины RSA, которые хранятся в папке ИЛИ на моем компьютере. и если вы хотите знать, где можно начать исправление, прежде чем вносить какие-либо изменения, просто начните с

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

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

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

0 голосов
/ 30 января 2010

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

0 голосов
/ 28 декабря 2009

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

НТН

...