X509Сертификат - Набор ключей не существует - PullRequest
29 голосов
/ 18 июня 2011

У меня есть WinForms приложение, которое использует WCF и передает в качестве параметра в сертификат сертификат:

mySvcClient.SendDocument(cert.Export(X509ContentType.SerializedCert, "password"));
...

В службе WCF я заново создал сертификат из массива байтов:

public void SendDocument (byte[] binaryCert)
{   
     X509Certificate2 cert = new X509Certificate2(binaryCert, "password");
...

Но при использовании сертификата для подписи xml я получил сообщение об ошибке «Набор ключей не существует»:

if (cert.HasPrivateKey) // WORKS!!!
{   
    signedXml.SigningKey = cert.PrivateKey; // THROW "keyset does not exist" EXCEPTION
...

На моем компьютере приложение работает на 100%! Но в WebServer я получил эту ошибку!

Вопрос в том, что даже если X509Certificate2 воссоздан из массива байтов, мне нужно специальное разрешение для доступа к закрытому ключу?

Спасибо!

Ответы [ 6 ]

35 голосов
/ 23 июля 2011

Если вы используете Windows Server 2008 или Windows 7, вам нужно разрешение на чтение закрытого ключа.

  1. используйте инструмент FindPrivateKey для поиска пути.Например:

FindPrivateKey My LocalMachine -n ​​"CN = MyCert" –a

возвращает путь: C: \ ProgramData \ Microsoft \ Crypto \RSA \ MachineKeys [Имя файла]

Перейти к этому пути и открыть свойства файла

Перейти на вкладку безопасности

Нажмите «Изменить», затем «Добавить»"

В открывшемся диалоговом окне напишите: IIS AppPool \ [имя вашего пула приложений] и нажмите OK

Теперь ваш пул приложений имеет разрешение на чтениеэтот закрытый ключ.

30 голосов
/ 09 июля 2013

Я столкнулся с этой проблемой, в моих сертификатах был закрытый ключ, но я получал эту ошибку (" Keyset not существует ")

Причина: Ваш веб-сайт работает под учетной записью " Сетевые службы " или имеет меньше привилегий.

Решение: Измените идентификатор пула приложений на " Локальная система ", сбросьте IIS и проверьте снова. Если он начинает работать, это проблема с привилегиями / меньшими привилегиями, вы можете выдать себя за другого, а затем использовать другие учетные записи.

11 голосов
/ 10 мая 2016

Я столкнулся с той же проблемой, и я не знаю, как (позор мне), но это сработало:

var certificate = new X509Certificate2(filePath, password,
    X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet);

certificate.PrivateKey; // before: error "KeySet does not exist"!

using (certificate.GetRSAPrivateKey()) { } // pure black magic

certificate.PrivateKey; // after: just works! lol

Я надеюсь, что кто-то может ответить на эту загадку.

4 голосов
/ 30 марта 2015

Вано Майсурадзе ответ работает.Если вы ищете инструмент FindPrivateKey, он включен в Примеры Windows Communication Foundation (WCF) и Windows Workflow Foundation (WF) для .NET Framework 4, которые можно найти здесь: http://www.microsoft.com/en-us/download/confirmation.aspx?id=21459

После загрузки ираспакуйте, откройте проект: WF_WCF_Samples \ WCF \ Setup \ FindPrivateKey \ CS в Visual Studio и скомпилируйте его.Затем откройте командную строку и перейдите к: WF_WCF_Samples \ WCF \ Setup \ FindPrivateKey \ CS \ bin

Затем перейдите к ответу Вано Майсурадзе

1 голос
/ 18 июня 2011

Мне кажется, проблема в том, что вам нужно добавить ключ в хранилище сертификатов машины.

0 голосов
/ 17 ноября 2017

Учетные записи удостоверений пула приложений по умолчанию не имеют доступа к хранилищу сертификатов.

Либо вы изменяете учетную запись на Network Services, как указано Vaibhav.Inspired, либо вы предоставляете доступ к сертификату.

Чтобы разрешить доступ, выполните следующую команду:

WinHttpCertCfg.exe -g -c LOCAL_MACHINE \ MY -s "IssuedToName" -a "AccountName"

Примечания:

- The tool may need to be installed first. The setup will place the tool at `C:\Program Files (x86)\Windows Resource Kits\Tools\WinHttpCertCfg.exe`.
- `IssuedName` is the issuer property of the certificate that the application will attempt to access
- The command must be run from command prompt with elevated privileges

Ссылка: https://support.microsoft.com/en-us/help/901183/how-to-call-a-web-service-by-using-a-client-certificate-for-authentica Шаг 2

Также вам необходимо включить опцию Mark this key as exportable при установке сертификата.

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