2016-11-10 2 views
1

Сейчас я загрузив файл .pfx, принимая в пароле и вызовAzure Web Application новый X509Certificate2() вызывает System.Security.Cryptography.CryptographicException: Доступ запрещен

var cert = new X509Certificate2(fileData, password); 

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

System.Security.Cryptography.CryptographicException: Access denied.

Есть ли способ, чтобы получить эту информацию обходя это или использовать этот метод без отказа в доступе? Я не очень хорошо знаком с сертификатами, поэтому дайте мне знать, если вам нужна дополнительная информация. Спасибо.

ответ

2

При открытии PFX на Windows любые личные ключи записываются на диск. Они будут удалены позже (если вы не укажете PersistKeySet), но они все равно должны быть записаны (ish).

Где они написаны?

  • Если вы укажете X509KeyStorageFlags.MachineKeySet: в хранилище ключей вы должны быть администратором.
  • Если вы укажете X509KeyStorageFlags.UserKeySet: В пользовательском хранилище ключей ваш профиль пользователя, вероятно, должен существовать/загружаться.
  • Если вы не укажете ни:
    • Если PFX сам закодирована, что ключ принадлежит в машине набор ключей (требуется администратор), то машина хранилища ключей.
    • В противном случае пользовательское хранилище (профиль, вероятно, требуется).

Учитывая «Access Denied» Я предполагаю, что вы попали в случае, когда сам PFX указанной машины хранилище ключей, чтобы решить эту проблему вы бы изменить вызов

new X509Certificate2(fileData, password, X509KeyStorageFlags.UserKeySet)

и все должно работать. Если вы укажете UserKeySet и все еще получите ошибку, это может привести к загрузке профиля.

- Возможность загрузки PFX без записи закрытых ключей на диск, но она недоступна в .NET Framework (хотя недавно она была добавлена ​​в .NET Core). Если вам это действительно нужно, вы можете посмотреть p/invoking PFXImportCertStore с флагом PKCS12_NO_PERSIST_KEY, затем передать полученное значение HCERTSTORE в X509Store.ctor(IntPtr) и прочитать ваши сертификаты через свойство X509Store.Certificates. Обратите внимание, однако, что большинство .NET Framework не поймут, что эти объекты cert связаны с закрытыми ключами, поэтому они, скорее всего, будут вести себя только как объекты сертификата общего пользования.

+0

Так просто! Отличное объяснение, спасибо! – naspinski

Смежные вопросы