Ошибка WCF: "Сертификат X.509 CN = повреждение локальной сети хоста..."
Я получаю эту ошибку, пытаясь заставить моего клиента и сервера WCF разговаривать друг с другом.
Сертификат X.509 CN = создание схемы localhost не удалось. сертификат, который был использован, имеет цепочку доверия, которая не может быть проверена. Замените сертификат или измените certificateValidationMode. цепочка сертификатов обработана, но завершена в корневом сертификате которому не доверяют доверие.
Все работает отлично, если отключить SSL-сертификаты.
Ответы
Ответ 1
Проблема с вашим сертификатом (я полагаю, вы используете самозаверяющий сертификат). WCF пытается проверить всю цепочку эмитентов и ожидает, что, наконец, цепочка завершится с помощью доверенных полномочий root. Чтобы отключить эту проверку, вы можете добавить такую строку в ветку app.config. Но этот "костыль" не должен использоваться в производстве serviceBehaviors/behavior/serviceCredentials/clientCertificate
<authentication certificateValidationMode="PeerOrChainTrust" revocationMode="NoCheck" />
Ответ 2
Я исправил проблему, отключив проверку в моем коде следующим образом:
client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode =
System.ServiceModel.Security.X509CertificateValidationMode.None;
Где client
- это экземпляр моей справки по сервису.
Ответ 3
Правильная вещь - настроить собственный сертификат доверенного корня Dev/Test и подписаться с этим сертификатом клиента и службы.
Обход доверия сети в вашей среде Dev/Test может "работать", но ваша среда Dev/Test теперь настроена по-разному на Production, что не является отличной идеей, так как вы можете обнаружить, что некоторые тесты создают ложные срабатывания или ложные негативы.
Ответ 4
У меня были некоторые трудности с этой же самой точной проблемой. Я использовал образец 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 в качестве локального администратора, мне удалось заставить образец работать (после запуска также командного файла, связанного со всеми образцами, для создания сертификата и т.д.)
Опять же, это не то, что вы делали бы в производственной среде, но знание того, как установить режим проверки подлинности сертификата службы, вероятно, довольно хорошо знать в целом.
Ответ 5
Добавьте поведение конечной точки в клиентское приложение (например, 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>
Ответ 6
При деактивации метода revocationMode, скорее всего, вам не хватает списка аннулирования клиента для вашего корневого ЦС.
makecert -crl -n "CN=CARoot" -r -sv CARoot.pvk CARoot.crl
Это также необходимо импортировать в доверенные корневые центры сертификации. См. Также мой ответ здесь.
Ответ 7
(Думаю, я поделился бы этим на случай, если кто-то там кого-нибудь кого-нибудь спадет). Я столкнулся с этой проблемой при запуске веб-приложения на WIF. Я исправил свою проблему, переместив копию сертификата x.509, с которым я работал, из папки "Сертификаты/личные/сертификаты" в папку "Доверенные корневые центры сертификации/сертификаты" в хранилище сертификатов. Вы можете сделать это, запустив консоль управления Microsoft.
Ответ 8
Следуя приведенному выше замечанию Aseiu, я обнаружил, что указанная выше ошибка будет выводиться, когда сертификат отсутствует в доверенном хранилище на сервере. Изучая эту проблему, я также обнаружил, что, посмотрев на средство просмотра событий в Windows Logs/Application, будет содержаться ошибка, указывающая на сертификат, с которым у него возникла проблема. Вы также можете сопоставить журнал активности с записями в журнале SVC для службы.