Сертификат 'CN = ds.com' должен иметь закрытый ключ. Процесс должен иметь права доступа к закрытому ключу - PullRequest
0 голосов
/ 04 июля 2018

После долгих поисков и попыток найти ответы на вопросы, каждое решение - все еще безуспешно

Краткое предисловие: запрос ответа от моей машины к себе - работает с сертификатом С другого компьютера на мою машину - нет.

На моей машине я создал 2 сертификата: открытый ключ и закрытый ключ через:

makecert -r -pe -n "CN=ds.com" -b 01/01/2018 -e 01/01/2020 
-sky exchange Server.cer -sv Server.pvk

А потом:

pvk2pfx.exe -pvk Server.pvk -spc Server.cer -pfx Server.pfx

(взято из здесь )

Я установил их оба в магазине на моей машине (через mmc):

enter image description here

Я использую эту простую конфигурацию WCF , которую я размещаю в WAS IIS на моей машине.

Когда я вызываю эту услугу (с моей машины на себя) с помощью этого простого кода:

  WSHttpBinding myBinding = new WSHttpBinding();
            myBinding.Security.Mode = SecurityMode.Message;
            myBinding.Security.Message.ClientCredentialType =MessageCredentialType.Certificate;
            EndpointAddress ea = new
                EndpointAddress("http://ds.com/Service1.svc/HelloWorldService");

            var client   = new HelloWorldServiceClient(myBinding, ea);

            client.ClientCredentials.ClientCertificate.SetCertificate(
                StoreLocation.CurrentUser,
                StoreName.Root,
                X509FindType.FindByThumbprint,
                "9394f570069e7af263ef7ca5a46a5bcab9f68659");
    Console.WriteLine(client.GetMessage("Mike Liu"));
    Console.ReadLine();
    client.Close();

- Я действительно получаю результат:

enter image description here

Отлично.

Теперь давайте перейдем к другому компьютеру, который я установил только в сертификат открытого ключа в доверенный корень.

Однако - теперь, когда я получаю доступ к моему компьютеру (с тем же кодом ^) - я получаю следующую ошибку:

Сертификат 'CN = ds.com' должен иметь закрытый ключ. Процесс должен иметь права доступа к закрытому ключу.

Даже если я выключаю службу WAS IIS на своем компьютере, я все равно вижу ошибку на другом компьютере.

Кажется, проблема только в другой машине. Я уже установил разрешение на другом компьютере:

C:\ProgramData\Microsoft\Crypto <--------Everyone: full control +inheritance

Вопрос:

Что мне здесь не хватает? Почему он ищет закрытый ключ на клиентском компьютере. У него не должно быть закрытого ключа. Частный должен находиться только на служебном компьютере. (это моя машина).

Изображение трассировки полного стека (на другом компьютере)

1 Ответ

0 голосов
/ 04 июля 2018

В вашем примере вы используете один и тот же сертификат на сервере и клиенте. Это не то, что должно быть.

Чтобы защитить запрос клиента, необходимо подписать запрос сертификатом клиента, а ответ сервера подписан сертификатом сервера.

Итак, на клиенте вы должны иметь:

  • закрытый (и открытый) ключ сертификата клиента в его личном хранилище сертификатов
  • открытый ключ сертификата сервера в доверенных корневых органах

На сервере у вас должен быть опозит:

  • закрытый (и открытый) ключ сертификата сервера в его личном хранилище сертификатов
  • открытый ключ сертификата клиента в доверенных корневых органах

Вы можете посмотреть пример здесь и узнать больше об этом здесь .

Подробности о протоколе HTTPS очень хорошо описаны в этой статье .

...