Подтвердить что ты не робот

Почему WCF жалуется на отказ проверки удостоверений личности?

Я создаю приложение WCF, в котором я буду использовать сертификаты для шифрования связи между клиентом и сервером. В моей среде разработки я хочу использовать сертификат test/self signed, который я создал с помощью makecert. (Только у сервера будет сертификат, клиент не будет).

Я установил сертификат в хранилище сертификатов, и все работает нормально. На клиенте certificateValidationMode в настоящее время установлен как "false", так как я работаю с тестовым сертификатом.

Моя проблема:

В app.config на клиенте мне нужно указать элемент идентификации как это:

<endpoint ... >
   <identity>
      <dns value="<Name-Of-Server-Computer>"/>
   </identity>
</endpoint>

Если я удалю элемент идентификации, я получаю следующее сообщение об ошибке в клиенте, когда я пытаюсь подключиться к серверу:

Ошибка проверки подлинности для исходящего сообщения. Ожидаемый идентификатор DNS удаленной конечной точки был "localhost", но удаленная конечная точка предоставила DNS-заявку "Name-of-Server-Computer". Если это законная удаленная конечная точка, вы можете устранить эту проблему, явно указав идентификатор DNS "Имя-сервер-компьютер" как свойство Identity EndpointAddress при создании прокси-сервера канала.

Итак, вот мои вопросы:

  • Проверяется ли проверка подлинности только при использовании тестового/самозаверяющего сертификата? Когда я развертываю свое приложение с использованием реального, надежного, сертификата, приобретенного у ЦС, будет ли выполняться проверка подлинности?

  • Есть ли способ отключить проверку личности? Я знаю, что могу создать собственный собственный сертификат проверки подлинности, но, похоже, не существует способа переопределить проверку идентификации, используя эти.

4b9b3361

Ответ 1

Проверка выполняется всегда - и должна быть. В основном WCF будет проверять, что сертификат выдается на имя домена (yourcompany.com) или имя машины, где находится ваша служба. Это проверка безопасности, которую я никогда не отключил бы! В противном случае любой, кто подделывает вашу службу, может использовать любой сертификат, созданный для произвольного имени домена/машины, и получать ваш трафик - не то, что вы хотите!

Итак, вам нужно убедиться, что ваш реальный сертификат на производственном сервере действительно выдается этому доменному имени, которое будет являться производственным сервером, например. если ваш производственный сервер будет находиться в "production.yourcompany.com", сертификат должен быть оформлен в этом домене.

Марк

Ответ 2

Ответ на этот вопрос содержится в самом сообщении об ошибке. На клиенте вы можете:

EndpointIdentity identity = EndpointIdentity.CreateDnsIdentity("Server");
EndpointAddress address = new EndpointAddress(new Uri("net.tcp://1.2.3.4:12345/ServiceName"), identity);

Замените "Сервер" на то, что ожидается. Обычно это будет общее имя (CN) вашего самозаверяющего сертификата. Это не повредит безопасности при условии, что вы несете полную ответственность за то, чтобы удостовериться, что представленный сертификат действителен, то есть создать свой собственный валидатор сертификатов и сделать там соответствующие проверки.

Ответ 3

certificateValidationMode должен быть установлен на "None", а не "false"...