2009-10-27 4 views
17

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

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

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

В app.config на клиенте, я должен указать единичный элемент, как это:

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

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

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

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

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

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

ответ

10

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

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

Марк

+0

> «Это проверка безопасности, которую я никогда бы не отключить!» Просто убедитесь, что я понимаю. Означает ли это, что есть способ отключить его? Я понимаю преимущества проверки ... – Nitramk

+1

Я даже не думал об этом, поэтому никогда не испытывал желания проверить, есть ли способ отключить его. Я не знаю, извините. –

24

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

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

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

+0

Вы правы! Этот ответ правильный. –

3

certificateValidationMode должен быть установлен в положение «None», а не «ложь» ...

Смежные вопросы