2016-12-01 8 views
4

Я пытаюсь создать самозаверяющий сертификат «на лету» (программно) на сборке C# (таргетинг .NET 4.0), чтобы служить в качестве корневого ЦС для создания других сертификатов. Сертификат не должен сохраняться в хранилище сертификатов Windows, я экспортирую его в файл.Запрошенная операция не поддерживается в CngKey.Create

Чтение через this question (и, в частности, @dthorpe's answer), я решил попробовать до CLR Security.

CLR Security библиотека положить метод расширения на CngKey class, чтобы создать собственный сертификат, но я не мог добиться успеха в создании экземпляра CngKey с:

var key = CngKey.Create(CngAlgorithm.Sha1); //same with Sha256, Sha512 and MD5 
//or 
var key = CngKey.Create(CngAlgorithm.Sha1, null, new CngKeyCreationParameters() 
{ 
    ExportPolicy = CngExportPolicies.AllowExport, 
    KeyUsage = CngKeyUsages.AllUsages, 
    KeyCreationOptions = CngKeyCreationOptions.MachineKey, 
}); 

Любой из этих линий вызывает исключение:

System.Security.Cryptography.CryptographicException был необработанное
HResult = -2146893783
Message = Запрошенная операция не поддерживается.

Source=System.Core 
StackTrace: 
    at System.Security.Cryptography.NCryptNative.CreatePersistedKey(SafeNCryptProviderHandle provider, String algorithm, String name, CngKeyCreationOptions options) 
    at System.Security.Cryptography.CngKey.Create(CngAlgorithm algorithm, String keyName, CngKeyCreationParameters creationParameters) 
    at System.Security.Cryptography.CngKey.Create(CngAlgorithm algorithm) 
    at Tests.Program.Main(String[] args) at Program.cs:line 51 

Поиск по SO и интернет, я проверил следующее:

  • Я бегу окно Windows 7 (так он поддерживает RPC как на MSDN)
  • Пробовал в окне Windows Server 2012, такая же ошибка
  • Процесс работает как администратор (поэтому он имеет доступ ко всем хранилищам сертификатов, так или иначе)
  • Th е услуги CNG Key Isolation и Remote Procedure Call (RPC)

Любая помощь будет принята с благодарностью.

ответ

1

Малый вне темы: во время поиска Google на этот вопрос нашли a site with HRESULT descriptions и удобный инструмент поиска на SO и MSDN (я просто гугле для HRESULT кода -2146893783)


Я нашел topic on MSDN, который содержит код неисправного с аналогичными HRESULT, и автор дает link to MSDN article about CNG:

NCRYPT_ALGORITHM_GROUP_PROPERTY L "Алгоритм Группа"
Строка Unicode с нулевым символом, которая содержит имя группы алгоритмов объекта. Это свойство применяется только к ключам. Следующие идентификаторы возвращаются ключевым поставщиком хранилища Microsoft:

  • NCRYPT_RSA_ALGORITHM_GROUP
    "RSA", The RSA алгоритм группы.
  • NCRYPT_DH_ALGORITHM_GROUP
    Группа "DH", группа Diffie-Hellman.
  • NCRYPT_DSA_ALGORITHM_GROUP
    «DSA», группа алгоритмов DSA.
  • NCRYPT_ECDSA_ALGORITHM_GROUP
    "ECDSA", группа алгоритмов elliptic curve DSA.
  • NCRYPT_ECDH_ALGORITHM_GROUP
    «ECDH», группа алгоритмов elliptic curve Diffie-Hellman.

Также я нашел статью на MSDN о CNG Key Storage Providers, который содержит аналогичный список алгоритмов:

  • Диффи-Хеллмана (DH)
    Секретное соглашение и обмен ключами, 512 to 4096 in 64-bit increments
  • Алгоритм цифровой подписи (DSA) Подписи, 512 to 1024 in 64-bit increments
  • эллиптических кривых Диффи-Хеллмана (ECDH) Секретное соглашение и обмен ключами, P256, P384, P521
  • эллиптических кривых Digital Signature Algorithm (ECDSA) Подписи, P256, P384, P521
  • RSA Асимметричное шифрование и подписание 512 to 16384 in 64-bit increments

Итак, как вы сказали, что вы пробовали только Sha1, Sha256, Sha512 и MD5, может быть, вы просто используете другой algorithm from list available? Вы можете найти там те, упомянутые выше:

Here other developers successfully created один из них и был в состоянии экспортировать его:

var cngKey = CngKey.Create(CngAlgorithm.ECDiffieHellmanP256, null, 
    new CngKeyCreationParameters { ExportPolicy = CngExportPolicies.AllowPlaintextExport }); 
+0

Это было, действительно, моя проблема. Спасибо. На странице Связанных поставщиков хранилищ CNG указано, что «Microsoft устанавливает следующие KSP, начиная с Windows Vista и Windows Server 2008. Поставщики могут создавать и устанавливать другие поставщики». – Dinei

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

  • Нет связанных вопросов^_^