Почему WCF жалуется на неудачу проверки личности? - PullRequest
20 голосов
/ 27 октября 2009

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

Я установил сертификат в хранилище сертификатов, и все работает нормально. На клиенте для CertificateValidationMode в настоящий момент установлено значение «ложь», поскольку я работаю с тестовым сертификатом.

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

В app.config на клиенте мне нужно указать элемент identity следующим образом:

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

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

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

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

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

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

Ответы [ 3 ]

32 голосов
/ 22 ноября 2011

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

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

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

11 голосов
/ 27 октября 2009

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

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

Марк

3 голосов
/ 03 декабря 2012

CertificateValidationMode должен быть установлен в «Нет», а не «ложь» ...

...