"Сталася внутрішня помилка." при завантаженні файлу pfx із X509Certificate2


79

Я намагаюся використовувати самопідписаний сертифікат (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 завантажується 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


Можливо, ця стаття може допомогти: codeproject.com/KB/WCF/wcfcertificates.aspx
Еммануель

Я отримував повідомлення про помилку the system cannot find the file specified. Відповідь @Randy Levy спрацював на мене!
Джесс

Відповіді:


145

Використовуйте локальний магазин комп’ютерів для закритого ключа:

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

MachineKeySetописується як "приватні ключі зберігаються в локальному комп'ютерному магазині, а не в поточному магазині користувачів". За замовчуванням без прапорів розміщується в магазині користувачів.

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

Іншим підходом (згідно з деякими коментарями нижче) є модифікація конфігурації IIS або ідентифікатора пулу додатків - які працюють. Однак це передбачає наявність доступу до цих елементів конфігурації, що може бути не так (наприклад, у середовищі спільного хостингу).


3
так, це допомагає, дякую. Ви могли б пояснити чому? docs не говорить нічого корисного.

2
Ти врятував мій день. Як не дивно, це працювало на моїй машині до оновлення рішення до .NET 4.0
Марк Клімент

1
Дійсно, потрібно було лише встановити параметр X509KeyStorageFlags.MachineKeySet. Насправді сумно, що у винятку просто вказано "Сталася внутрішня помилка". Не дуже корисно.
Ніколі

2
Ви також можете додати більше привілеїв на закритий ключ до облікового запису, призначеного пулу програм. Або змініть ідентифікатор пулу додатків на "Місцева служба".
guzart

1
А для більш швидкого виправлення / обхідний перевірки: stackoverflow.com/questions/9951729 / ...
Кипріян Teiosanu

13

Я спробував рішення Ренді змінити його на MachineKeySet, але потім отримав повідомлення про помилку:

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

Тож після невеликого гуглиння я знайшов допис, в якому пропонувалося змінити його на:

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

і це розібрало мої проблеми.

Я ще не пробував пропозицію змінити налаштування параметрів пулу програм у конфігурації IIS. Для цього перейдіть у Додаткові налаштування для пулу програм вашого сайту, а потім встановіть для параметра «завантажити профіль користувача» значення «істина». Якщо це налаштування хибне, контейнери ключів, очевидно, недоступні.


Я отримав вищезазначену помилку, і ваше рішення допомогло її вирішити. Дякую.
dotcoder

Мені не подобаються коментарі, які не допомагають (як цей), але дозвольте сказати вам, що ви рятуєте мій день. Дякую!
rasputino
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.