Вопрос: «Внутренняя ошибка произошла». При загрузке файла pfx с помощью X509Certificate2


Я пытаюсь использовать самозаверяющий сертификат (c #):

X509Certificate2 cert = new X509Certificate2(
    Server.MapPath("~/App_Data/myhost.pfx"), "pass");

на общем сервере веб-хостинга, и я получил сообщение об ошибке:

System.Security.Cryptography.CryptographicException: An internal error occurred.

трассировка стека заканчивается

System.Security.Cryptography.CryptographicException.
    ThrowCryptogaphicException(Int32 hr) +33
System.Security.Cryptography.X509Certificates.X509Utils.
    _LoadCertFromFile(String fileName, IntPtr password, UInt32 dwFlags, 
        Boolean persistKeySet, SafeCertContextHandle& pCertCtx) +0
System.Security.Cryptography.X509Certificates.X509Certificate.
    LoadCertificateFromFile(String fileName, Object password, 
        X509KeyStorageFlags keyStorageFlags) +237
System.Security.Cryptography.X509Certificates.X509Certificate2..ctor(
    String fileName, String password) +131

На моей машине dev она загружается нормально. Причина, по которой я загружаю * .pfx не файл * .cer, потому что мне нужен доступ к закрытому ключу (файл cer загружает Ok). Я сделал pfx на моем dev mochine:

makecert -r -n "CN=myhost.com, E=admin@myhost.com" -sky exchange -b 01/01/2009
    -pe -sv myhost.pvk myhost.cer
<b>pvk2pfx</b> -pvk myhost.pvk -spc myhost.cer -pfx myhost.pfx -po pass</code>

Я использую версию v5.131.3790.0 от makecert


71


источник


Ответы:


Используйте локальный компьютер для закрытого ключа:

X509Certificate2 cert = new X509Certificate2("myhost.pfx", "pass",
    X509KeyStorageFlags.MachineKeySet);

MachineKeySet описывается как «личные ключи хранятся в локальном хранилище компьютеров, а не в текущем хранилище пользователей». По умолчанию без флажков помещается в хранилище пользователей.

Несмотря на то, что вы читаете сертификат с диска и сохраняете его в объекте, закрытые ключи все еще хранятся в базе данных ключей поставщика криптографических услуг Microsoft Cryptographic. На сервере хостинга процесс ASP.NET не имеет разрешения на доступ к хранилищу пользователей.

Другой подход (согласно некоторым комментариям ниже) заключается в изменении конфигурации IIS Configuration или App Pool, которые работают. Однако это предполагает, что есть доступ к этим элементам конфигурации, которые могут быть не такими (например, в среде совместного размещения).


137



Я попробовал решение Рэнди изменить его на MachineKeySet, но затем получил сообщение об ошибке:

"недействителен для использования в указанном состоянии"

Поэтому после небольшого поиска в Google я нашел сообщение, которое предложило изменить его на:

var certificate = new X509Certificate2(certKeyFilePath, passCode, 
X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet |       
X509KeyStorageFlags.PersistKeySet );

и это разобрало мои проблемы.

Я еще не пробовал предлагать изменить настройку пула настроек приложения в конфигурации IIS. Для этого перейдите в «Дополнительные настройки» для пула приложений вашего сайта, а затем установите «load user profile» в true. Если этот параметр не установлен, контейнеры ключей недоступны.


9