«Произошла внутренняя ошибка.» При загрузке файла 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

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

makecert -r -n "CN=myhost.com, [email protected]" -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

73 голоса | спросил tmp3128 28 AM000000100000003731 2009, 10:01:37

2 ответа


0

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

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

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

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

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

ответил Randy Levy 28 AM000000100000000931 2009, 10:48:09
0

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

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

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

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

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

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

ответил Myke Black 9 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 09 Sep 2015 12:17:57 +0300 2015, 12:17:57

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132