Подтвердить что ты не робот

Как сообщить WCF о пропуске проверки сертификата?

Попытка сделать веб-сервис для вызова HTTPS endpoint в приложении 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 пропустить проверку?

4b9b3361

Ответ 1

Возможно, вы сможете достичь этого в 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-приложением, вам нужно поставить элемент < domain uri = "http://" / > * внутри вашего < allow-from > элемент.

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


Отключение проверки сертификата 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

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

Услуги 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" />