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

При использовании конфигурации, защищенной 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>

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

11.12.2008 04:28:28
2 ОТВЕТА

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

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

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

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

1
11.12.2008 05:24:57

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

1
11.12.2008 19:51:11
Правильно. Ключ -exp является необязательным дополнением к параметру -pi aspnet_regiis - Импортировать пару ключей RSA из файла XML.
JohnH 26.07.2019 15:25:25