Как мне сказать WCF пропустить проверку сертификата? - PullRequest
24 голосов
/ 03 декабря 2008

Попытка сделать вызов веб-службы для конечной точки HTTPS в моем приложении Silverlight приводит к этой ошибке: «Не удалось найти базовый адрес, который соответствует Схема https для конечной точки с привязкой WSHttpBinding. Зарегистрированные схемы базовых адресов: [http] "

Та же проблема, что была опубликована здесь:

http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/4c19271a-f5e6-4659-9e06-b556dbdcaf82/

Итак, одно из предложений заключалось в следующем: «Другая проблема может заключаться в том, что имя сертификата и имя машины не совпадают, и это приводит к тому, что WCF соответствует». Если это В этом случае вы можете попросить WCF пропустить проверку сертификата. "

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

Вот как я настроил свой клиент:

BasicHttpBinding binding = new BasicHttpBinding();
binding.Security.Mode = BasicHttpSecurityMode.Transport;
_ws = new AnnotationService.AnnotationClient(binding, new EndpointAddress(myAddress));

Как я могу сказать WCF пропустить проверку?

Ответы [ 2 ]

33 голосов
/ 26 января 2009

Этого можно добиться в Silverlight, если разрешить междоменную связь между веб-сервером, на котором размещено приложение Silverlight, и удаленной службой WCF.

В этом случае вам нужно разместить файл clientaccesspolicy.xml в корне домена, где размещена служба WCF:

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
  <cross-domain-access>
    <policy>
      <allow-from http-request-headers="SOAPAction">
        <domain uri="http://*"/>
      </allow-from>
      <grant-to>
        <resource path="/" include-subpaths="true"/>
      </grant-to>
    </policy>
  </cross-domain-access>
</access-policy>

Вот что MSDN заявляет об этом подходе :

Чтобы разрешить доступ к службе HTTPS с любого элемента управления Silverlight, размещенного через приложение HTTP, вам нужно поставить элемент ” /> * внутри вашего элемента .

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


Отключение проверки сертификата X.509 в .NET

Для приложений .NET этот пример конфигурации WCF отключит проверку того, является ли сертификат доверенным и действителен ли он на клиенте:

<system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="DisableServiceCertificateValidation">
            <clientCredentials>
                <serviceCertificate>
                    <authentication certificateValidationMode="None"
                                    revocationMode="NoCheck" />
                </serviceCertificate>
            </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <client>
      <endpoint address="http://localhost/MyService"
        behaviorConfiguration="DisableServiceCertificateValidation"
        binding="wsHttpBinding"
        contract="MyNamespace.IMyService"
        name="MyServiceWsHttp" />
    </client>
</system.serviceModel>

Альтернативное решение - предоставить пользовательскую логику для проверки сертификата X.509, предоставляемого службой. В этом случае вам придется изменить файл конфигурации в соответствии со следующим:

<system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="DisableServiceCertificateValidation">
            <clientCredentials>
                <serviceCertificate>
                    <authentication certificateValidationMode="Custom"
                                    customCertificateValidatorType="MyCertificateValidator, Client"
                                    revocationMode="NoCheck" />
                </serviceCertificate>
            </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <client>
      <endpoint address="http://localhost/MyService"
        behaviorConfiguration="DisableServiceCertificateValidation"
        binding="wsHttpBinding"
        contract="MyNamespace.IMyService"
        name="MyServiceWsHttp" />
    </client>
</system.serviceModel>

Затем создайте класс, производный от X509CertificateValidator , для реализации собственной логики проверки.

public class MyCertificateValidator : X509CertificateValidator
{
    public override void Validate(X509Certificate2 certificate)
    {
        // Add custom validation logic
        // Throw an exception to fail validation
    }
}

Как всегда, вы можете найти более подробный пример на MSDN.

2 голосов
/ 03 декабря 2008

Это не похоже на ошибку проверки сертификата. Похоже, ошибка конфигурации веб-службы. Можете ли вы опубликовать конфигурацию вашей конечной точки на сервере?

Службы WCF по умолчанию не поддерживают SSL, необходимо включить безопасность транспорта, создав конфигурацию привязки и указав на нее свою конечную точку с помощью атрибута bindingConfiguration.

Вот пример конфигурации привязки, которая поддерживает SSL:

<bindings>
  <basicHttpBinding>
    <binding name="SecureTransport">
      <security mode="Transport">
        <transport clientCredentialType="None"/>
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

и ваша конфигурация конечной точки будет выглядеть так:

<endpoint address=""
   binding="basicHttpBinding"
   bindingConfiguration="SecureTransport"
   contract="MyServices.IWebService" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...