Я получил ту же ошибку при использовании класса EncryptedXml, сертификатов X.509, и я забыл предоставить доступ к закрытому ключу сертификата владельцу процесса / задачи процесса дешифрования.Поэтому не забудьте предоставить доступ к закрытому ключу!
Я знаю, что когда вы делитесь файлами web.config на всех серверах веб-фермы, которые зашифрованы с помощью специального / общего ключа RSA-CSPВы также должны предоставить ключ в контейнере всем серверам, которые должны будут расшифровать зашифрованный текст в вашем файле web.config.После того как вы импортируете ключ из контейнера на каждом сервере в ферме, вам нужно предоставить доступ к идентификатору пула приложений, который запускается вашим приложением asp.net, как в IIS.Посмотрите аргументы -pc, -px, -pi и -pa для инструмента aspnet_regiis.exe, чтобы узнать, как создать, экспортировать, импортировать и разрешить доступ к ключам RSA соответственно (http://msdn.microsoft.com/en-us/library/k6h9cz8h.ASPX). Это еще один хороший ресурс: http://msdn.microsoft.com/en-us/library/2w117ede.aspx.
Чтобы сделать это на практике более детерминированным, я запустил свое приложение в IIS под учетной записью службы домена, создал настраиваемый общий ключ RSA, импортированный через мою веб-ферму, и предоставил доступ к ключу.в учетную запись службы домена, а затем зашифровали важные части файла web.config с помощью специального ключа (см. аргументы -pef и -pdf для aspnet_regiis.exe).
Если вы шифруете настройки приложения, вы можетехотите создать собственный раздел app.config / web.config (если вы не заинтересованы в шифровании всех «appSettings»). Затем зашифруйте его с помощью ключа Right с помощью aspnet_regiis.exe. Наконец, распространите защищенную сеть.config в процессе развертывания (вы, вероятно, упаковали бы зашифрованный файл web.config вместе с вашим приложением). Встроенный configProtectionProvider, который прозрачно шифрует / дешифрует разделы app.config и web.config, очень удобен.
Вот пример того, как будет выглядеть такой зашифрованный раздел в файле:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="secureAppSettings" type="System.Configuration.NameValueSectionHandler"/>
</configSections>
<configProtectedData>
<providers>
<add name="MyKeyProvider"
type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
keyContainerName="MyKey"
useMachineContainer="true" />
</providers>
</configProtectedData>
<secureAppSettings configProtectionProvider="MyKeyProvider">
<EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<KeyName>Rsa Key</KeyName>
</KeyInfo>
<CipherData>
<CipherValue>deadbeef</CipherValue>
</CipherData>
</EncryptedKey>
</KeyInfo>
<CipherData>
<CipherValue>cafef00d</CipherValue>
</CipherData>
</EncryptedData>
</secureAppSettings>
</configuration>
Как вы можете видеть, встроенная защита конфигурации использует ту же платформу для XML EncryptedData, но просто выполняет всю работу по шифрованию за вас.Это работает одинаково для служб Windows и настольных приложений, если вы правильно предоставляете доступ к закрытым ключам.