IX509PrivateKey :: Метод экспорта из C # - PullRequest
0 голосов
/ 25 мая 2018

Просто интересно, может ли кто-нибудь, кто работал с API регистрации сертификатов Microsoft, предложить какую-то помощь в этом.Я пытаюсь использовать метод IX509PrivateKey :: Export, который описан здесь: https://msdn.microsoft.com/en-us/library/windows/desktop/aa379006%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396.

Мой код C # для вызова этого метода выглядит следующим образом:

privateKey.Export("BCRYPT_PRIVATE_KEY_BLOB", EncodingType.XCN_CRYPT_STRING_ANY);

К сожалению этовозвращает ошибку: «Параметр неверен.0x80090027 ”

Ошибка не очень полезна, так как я не уверен, какой параметр вызывает проблему, поскольку они оба используют значения, указанные в документации API.Обратите внимание, что до того, как этот код был вызван, закрытый ключ был инициализирован, создан и может быть успешно использован для генерации CSR через этот API.

Я подумал, что это может быть связано с проблемой перевода строки C # в тип BSTR, который можно использовать с неуправляемым кодом, поэтому я попробовал несколько методов для проверки этой теории, но не оченьудачи.У меня такое ощущение, что сама ошибка может быть сгенерирована функцией CNG NCryptExportKey, которая описана здесь: https://msdn.microsoft.com/en-us/library/windows/desktop/aa376263%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396. Я хотел бы попытаться избежать беспорядочных / небезопасных решений, таких как P / Invoke, если это возможно.

Был бы рад услышать любые идеи от кого-либо.Дайте мне знать, если я могу предоставить дополнительную информацию.

1 Ответ

0 голосов
/ 14 сентября 2018

У меня была точно такая же проблема.Для меня проблема заключалась в частичном порядке использования закрытого ключа и частичном использовании правильного параметра в вызове экспорта.Мое решение выглядит следующим образом:

  CX509PrivateKey privateKey = new CX509PrivateKey();
  //these flags have to be set before the key is created-- they're read only afterward
  privateKey.KeyUsage = X509PrivateKeyUsageFlags.XCN_NCRYPT_ALLOW_ALL_USAGES;
  privateKey.ExportPolicy = X509PrivateKeyExportFlags.XCN_NCRYPT_ALLOW_PLAINTEXT_EXPORT_FLAG;
  privateKey.Create();
  //initialize a request using the private key
  pkcs10.InitializeFromPrivateKey(X509CertificateEnrollmentContext.ContextUser, privateKey, templateName);
  //export the key, using the correct export type and encoding (I used the default)
  string exportedKey = privateKey.Export("PRIVATEBLOB"); 

Обратите внимание, что параметр, передаваемый в функцию экспорта, равен "PRIVATEBLOB", который отмечается ... нигде, насколько я могу судить.Я нашел это здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...