Как использовать защищенную конфигурацию 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?