"Произошла внутренняя ошибка."при загрузке 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 не a *.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

453   2  

2 ответов:

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

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

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

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

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

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

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

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

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

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

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

Comments

    Ничего не найдено.