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

После долгих поисков и попыток найти ответы других, все решения остались безуспешными

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

На своей машине я создал 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):

введите описание изображения здесь

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

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

  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();

- ПОЛУЧАЮ РЕЗУЛЬТАТ:

введите описание изображения здесь

Отлично

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

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

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

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

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

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

Вопрос:

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

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


person Royi Namir    schedule 04.07.2018    source источник


Ответы (1)


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

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

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

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

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

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

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

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

person danijelk    schedule 04.07.2018
comment
Спасибо за ответ - Насколько я понимаю (возможно, ошибочно), сервер должен иметь публичные и частные сертификаты. Пока у пользователей должен быть только public. и они могут зашифровать данные, которые может открыть только закрытый ключ. Нет ? Если это так - я не понимаю, почему у клиентов по всему миру должен быть закрытый ключ. - person Royi Namir; 04.07.2018
comment
При общении между клиентом и сервером у вас есть как запрос, так и ответ. Запрос от клиента зашифровывается открытым ключом сервера и расшифровывается закрытым ключом сервера на сервере. Ответ от сервера зашифровывается открытым ключом клиента и расшифровывается на клиенте закрытым ключом клиента. Так что да, вам нужно и то, и другое. - person danijelk; 04.07.2018
comment
Привет. Вы сказали Подробности о HTTPS, но в моем коде используется EndpointAddress ea = new EndpointAddress("http://ds.com/Service1.svc/HelloWorldService"); (не HTTPS). Так как же это работает? Также - Используется ли код client.ClientCredentials.ClientCertificate.SetCertificate для шифрования сообщения или для дешифрования - когда ответ возвращается с сервера? - person Royi Namir; 05.07.2018