Защищенная конфигурация ASP.NET - Как шифровать только с открытым ключом? - PullRequest
1 голос
/ 11 декабря 2008

Как использовать защищенную конфигурацию ASP.NET, как я могу зашифровать конфигурацию только с помощью открытого ключа?

Я могу экспортировать файл открытого ключа. Затем я хотел бы использовать этот открытый ключ для шифрования файлов конфигурации на другом сервере для последующего развертывания. Однако я не могу понять, как заставить aspnet_regiis использовать экспортированный открытый ключ.

По сути, я попытался импортировать только открытый ключ в контейнер, а затем зашифровал его. Однако, когда я делаю это, вместо того, чтобы использовать существующий ключ для шифрования, он создает совершенно новую пару ключей, перезаписывая существующий открытый ключ. В приведенном ниже сценарии, если вы переименуете каждый из скопированных файлов обратно в connections.config и попытаетесь расшифровать их, первый (connectionstring_server.encrypted) потерпит неудачу, а второй (connectionstring_build.encrypted) будет успешным), доказав, что новая пара ключей была создана.

Вот пакетный файл, который демонстрирует использованный мною подход (правка: это всего лишь пример для тестирования возможностей aspnet_regiis. Мое фактическое использование его, очевидно, будет немного другим):

REM delete container in case it already exists
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pz "MyKeys"

REM create container
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pc "MyKeys"

REM export key
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -px "MyKeys" "publicKey.xml"

REM encrypt file
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pef "connectionStrings" . -prov "MyProvider"

REM copy encrypted file for later comparison
copy connections.config connectionstring_server.encrypted
pause

REM decrypt file
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pdf "connectionStrings" .

REM delete continer
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pz "MyKeys"

REM import public key
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pi "MyKeys" publicKey.xml

REM encrypt file with just public key - THIS DOES NOT WORK CORRECTLY, it creates a new keypair
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pef "connectionStrings" . -prov "MyProvider"

REM copy back encrypted file
copy connections.config connectionstring_build.encrypted
pause

REM decrypt file
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -pdf "connectionStrings" .

А вот пример web.config

<?xml version="1.0"?>
<configuration>
    <configProtectedData>
        <providers>
            <add name="MyProvider" keyContainerName="MyKeys" type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" useMachineContainer="true" />
        </providers>
    </configProtectedData>
  <connectionStrings configSource="connections.config" />
</configuration>

И соответствующие соединения.config:

<connectionStrings>
  <add name="SomConnectionName" connectionString="Data Source=somedatasource; Initial Catalog=somedatabase; Integrated Security=SSPI; Persist Security Info=False;" providerName="System.Data.SqlClient" />
</connectionStrings>

Edit: Ниже предлагается ответ, что я также могу экспортировать закрытый ключ. Это действительно позволило бы шифрованию работать, но мне не нужен личный ключ для шифрования. Я хочу оставить закрытый ключ только на сервере, который будет использовать файл конфигурации, и сохранить открытый ключ в более доступном месте. Является ли неспособность сделать это просто ограничением aspnet_regiis?

Ответы [ 2 ]

1 голос
/ 11 декабря 2008

Я думаю, что ваша проблема в команде экспорта, когда вы экспортируете, вам нужно указать аргумент -pri, чтобы сообщить aspnet_regiis, что вы хотите экспортировать как закрытый ключ, так и открытый ключ.

REM export key
\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis -px "MyKeys" "publicKey.xml" -pri

Без закрытого ключа ваш импорт все еще создает свою собственную пару ключей. Это может быть ошибка Microsoft, aspnet_regiis должен по крайней мере предупредить вас, что он не смог импортировать ваш неполный ключ и вместо этого создал новый ключ ...

Может быть полезен экспорт только открытого ключа, после чего вы могли бы дать вашей операции или группе разработчиков файл xml, и они могли бы зашифровать файл конфигурации перед его развертыванием на сервере, не раскрывая секретный ключ. Кроме того, таким образом вам не нужно будет запускать процесс шифрования на каждом сервере в вашей ферме.

0 голосов
/ 11 декабря 2008

Я не знаю, является ли это ошибкой или нет, но я определенно столкнулся с этой проблемой. Открытый и закрытый ключи необходимо импортировать в хранилище ключей Windows, чтобы работала любая из функций .net. Однако закрытый ключ можно защитить, не указав ключ -exp при импорте ключа.

...