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

Как временно остановить ошибки сертификата с помощью служб WCF

Я тестирую ранний выпуск веб-сервиса WCF, который я создал. На стороне клиента, когда я использую VS для добавления ссылки на службу, все работает.

Но когда я пытаюсь использовать службу, я получаю ошибку,

Could not establish trust relationship for the SSL/TLS secure
channel with authority **

Где звезды представляют IP-адрес сервера.

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

На стороне клиента для меня был создан app.config,

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="BindingName" closeTimeout="00:01:00"
                    openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
                    bypassProxyOnLocal="false" transactionFlow="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                    messageEncoding="Text" textEncoding="utf-8" useDefaultWebProxy="true"
                    allowCookies="false">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="false" />
                    <security mode="Transport">
                        <transport clientCredentialType="Windows" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="Windows" negotiateServiceCredential="true" />
                    </security>
                </binding>
            </wsHttpBinding>
        </bindings>
        <client>
            <endpoint address="***************"
                binding="wsHttpBinding" bindingConfiguration="BindingName"
                contract="***************" name="BindingName">
                <identity>
                    <servicePrincipalName value="***************" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>

Итак, какие параметры мне нужно изменить, чтобы временно игнорировать ошибки сертификата?

4b9b3361

Ответ 1

Установите CertificatePolicy PRIOR для инициализации вашей службы WCF на клиенте. Вот как (просто сделайте вызов метода SetCertificatePolicy() один раз)

 /// <summary>
    /// Sets the cert policy.
    /// </summary>
    private static void SetCertificatePolicy()
    {
        ServicePointManager.ServerCertificateValidationCallback += ValidateRemoteCertificate;
    }

    /// <summary>
    /// Certificate validation callback 
    /// </summary>
    private static bool ValidateRemoteCertificate(object sender, X509Certificate cert, X509Chain chain, SslPolicyErrors error)
    {
        if (error == SslPolicyErrors.None)
        {
           return true;   // already determined to be valid
        }

        switch (cert.GetCertHashString())
        {
           // thumbprints/hashes of allowed certificates (uppercase)
           case "066CF9CAD814DE2097D368F22D3A7D398B87C4D6":
           case "5B82C96685E3A20079B8CE7AFA32554D55DB9611":

              Debug.WriteLine("Trusting X509Certificate '" + cert.Subject + "'");
              return true;

           default:
              return false;
        }
    }

Ответ 2

<configuration>
  <system.net>
    <settings>
      <servicePointManager checkCertificateName="false" checkCertificateRevocationList="false" />
    </settings>
  </system.net>
</configuration>

Это работает для меня. Благодаря

Ответ 3

Проверьте ответ на этот вопрос:

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

он дает два возможных решения:  1. используя только записи конфигурации на стороне клиента  или  2. используйте специальный валидатор сертификатов, который использует как код, так и записи конфигурации

Ответ 4

Модификация web.config работала для меня

Я сделал это, используя ответ Стива Эллингера и некоторые поисковые запросы. По сути, мне пришлось:

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

Вот фрагменты web.config...

<configuration>

  <system.net>
    <settings>
      <servicePointManager checkCertificateName="false" checkCertificateRevocationList="false" />
    </settings>
  </system.net>

  <system.serviceModel>
    <client>
      <endpoint ... behaviorConfiguration="DisableServiceCertificateValidation" />
    </client>

    <behaviors>
      <endpointBehaviors>
        <behavior name="DisableServiceCertificateValidation">
          <clientCredentials>
            <serviceCertificate>
              <authentication certificateValidationMode="None"
                              revocationMode="NoCheck" />
            </serviceCertificate>
          </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>

</configuration>

Ответ 5

Вы также можете переопределить этот параметр oneliner.

ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, errors) => true;

Просто вставьте его в созданный конструктор клиента WCF в Reference.cs

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
public partial class WebQuoteServiceClient : System.ServiceModel.ClientBase<Corp.Legal.Webservices.ServiceReference1.IWebQuoteService>, Corp.Legal.Webservices.ServiceReference1.IWebQuoteService {

    public WebQuoteServiceClient()
    {
        ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, errors) => true;
    }