Ошибка WCF: «Ошибка сертификата X.509 CN = построение цепочки локального хоста ...» - PullRequest
36 голосов
/ 23 ноября 2010

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

Сбой сертификата X.509 CN = localhost. Использованный сертификат имеет цепочку доверия, которую невозможно проверить. Замените сертификат или измените CertificateValidationMode. цепочка сертификатов обработана, но завершена корневым сертификатом которому не доверяет доверие.

Все работает отлично, если я выключаю SSL-сертификаты.

Ответы [ 8 ]

39 голосов
/ 14 февраля 2012

Я исправил проблему, отключив проверку в моем коде, например:

client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = 
System.ServiceModel.Security.X509CertificateValidationMode.None;

Где client - это экземпляр моей справочной службы.

32 голосов
/ 23 ноября 2010

Существует проблема с вашим сертификатом (я полагаю, вы используете самозаверяющий сертификат). WCF пытается проверить всю цепочку эмитентов и ожидает, что эта цепочка в конечном итоге закончится на доверенном корне.Чтобы отключить эту проверку, вы можете добавить такую ​​строку в ветку app.config.Но этот «костыль» не должен использоваться в производстве serviceBehaviors/behavior/serviceCredentials/clientCertificate

<authentication certificateValidationMode="PeerOrChainTrust" revocationMode="NoCheck" />
7 голосов
/ 18 марта 2014

Правильно, что нужно сделать, это настроить свой собственный корневой сертификат Dev / Test и подписать сертификаты клиента и сервиса с этим.

Обход цепного доверия в среде разработки / тестированияможет «работать», но ваша среда разработки / тестирования теперь настроена иначе, чем Production, что не очень хорошая идея, поскольку вы можете обнаружить, что некоторые тесты дают ложные срабатывания или ложные отрицания.

3 голосов
/ 13 января 2016

Добавьте поведение конечной точки в ваше клиентское приложение (например, App.config) и установите конфигурацию поведения, которую вы добавили в конечную точку.

 <behaviors>
          <endpointBehaviors>
            <behavior name="certificateEndpointBehavior">
              <clientCredentials>
                <serviceCertificate>             
                  <authentication certificateValidationMode="None" revocationMode="NoCheck"/>
                </serviceCertificate>
                </clientCredentials>      
            </behavior>
          </endpointBehaviors>
        </behaviors>

<endpoint address="http://localhost/Invoice.svc" binding="wsHttpBinding"  bindingConfiguration="WsHttpBinding_ACKS" contract="Invoice" name="Invoice"
       behaviorConfiguration="certificateEndpointBehavior" >

</endpoint>
3 голосов
/ 17 мая 2013

У меня были некоторые трудности с этой же самой проблемой.Я использовал образец CustomToken-VS2010 из WIF SDK.

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

У меня была та же проблема.У меня была проблема "где мне установить этот режим?"Мне было трудно найти объект, для которого было установлено это свойство, который на самом деле был правильным объектом.Я наконец нашел его как часть ChannelFactory :

using System.ServiceModel.Security;
:
ChannelFactory<IEcho> echoChannelFactory = new ChannelFactory<IEcho>(...)
echoChannelFactory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;

Итак, место для установки этого объекта - объект ChannelFactory.

Запуск Visual Studio 2010 как локальногоадминистратор, я смог заставить образец работать (после того, как я также запустил пакетный файл, связанный со всеми образцами для создания сертификата и т. д.)

Опять же, это не что-товы бы поступили в производственной среде , но знание режима настройки режима аутентификации сертификата службы, вероятно, является хорошей вещью, которую нужно знать в целом.

1 голос
/ 06 декабря 2017

Когда деактивация revocationMode помогла, то, скорее всего, вам не хватает списка отзыва клиентов для вашего корневого CA.

makecert -crl -n "CN=CARoot" -r -sv CARoot.pvk CARoot.crl

Это также необходимо импортировать в сертификацию доверенного корнявласти.Смотри также мой ответ здесь .

0 голосов
/ 21 февраля 2017

Следуя вышеприведенному комментарию Асею, я обнаружил, что та же самая ошибка выше будет выводиться, когда сертификат отсутствует в доверенном хранилище на сервере. Исследуя эту проблему, я также обнаружил, что при просмотре средства просмотра событий в разделе «Журналы / приложения Windows» будет обнаружена ошибка, в которой подробно описан сертификат, с которым возникла проблема. Вы также можете соотнести журнал операций с записями в журнале SVC для службы.

0 голосов
/ 24 февраля 2016

(Я думал, что поделюсь этим на всякий случай, если это кого-то сэкономит) Я столкнулся с этой проблемой при запуске веб-приложения на WIF.Я исправил проблему, переместив копию сертификата x.509, с которым работал, из папки «Сертификаты / личные / сертификаты» в папку «Доверенные корневые центры сертификации / Сертификаты» внутри хранилища сертификатов.Вы можете сделать это, запустив консоль управления Microsoft

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...