Взаимная аутентификация WCF и SSL 403 - Запрещено: доступ запрещен - PullRequest
1 голос
/ 07 апреля 2011

Я создал службу данных wcf и выставляю ее через HTTP с обязательным SSL. Я пытаюсь настроить, где и служба, и клиенты проходят проверку подлинности с помощью сертификатов (взаимная проверка подлинности). Я использую сертификаты разработчика. Итак, я добавил сертификат сервера в хранилище доверенных лиц клиента.

но я все еще получаю исключение: «403 - Запрещено: доступ запрещен».

1- Вот мой конфиг сервера:

 <system.serviceModel>
    <bindings>
        <webHttpBinding>
            <binding name="webHttpBindingConfig">
                <security mode="Transport">
                    <transport clientCredentialType="Certificate" />
                </security>
            </binding>
        </webHttpBinding>
    </bindings>
    <behaviors>

    </behaviors>
    <services>
        <service behaviorConfiguration="" name="PricingDataService">
            <endpoint address="https://MyServiceSecure/MyServiceSecure/MyServiceSecure.svc"
                binding="webHttpBinding" bindingConfiguration="webHttpBindingConfig"
                name="webHttpEndpoint" contract="System.Data.Services.IRequestHandler" />
        </service>
    </services>

Как мне заставить сервер распознавать сертификат клиента? (это также должен быть сертификат разработчика).

2- Вот мой конфиг клиента:

  <system.serviceModel>
    <bindings>
        <webHttpBinding>
            <binding name="webHttpBindingConfig">
                <security mode="Transport">
                    <transport clientCredentialType="Certificate" />
                </security>
            </binding>
        </webHttpBinding>
    </bindings>
    <behaviors>
      <endpointBehaviors>
        <behavior name="clientCredentialBehavior">
          <clientCredentials>
            <clientCertificate storeName="TrustedPeople" storeLocation="LocalMachine"
                                x509FindType="FindBySubjectName" findValue="tempClientcert" />
          </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <client>
        <endpoint address="https://MyServiceSecure/MyServiceSecure/MyServiceSecure.svc"
            binding="webHttpBinding" bindingConfiguration="webHttpBindingConfig"
            contract="System.Data.Services.IRequestHandler" name="" kind=""
            endpointConfiguration="" behaviorConfiguration="clientCredentialBehavior">
            <identity>
              <dns value="MyServiceSecure"/>
            </identity>
        </endpoint>
    </client>
</system.serviceModel>

3- Вот код, который я использую для вызова кода wcf:

> MyServiceContext service = new MyServiceContext (
            new Uri("https://MyServiceSecure/MyServiceSecure/MyServiceSecure.svc"));

service.SendingRequest += this.OnSendingRequest_AddCertificate;


//
private void OnSendingRequest_AddCertificate(object sender, SendingRequestEventArgs args)
    {
        if (null != ClientCertificate)
            (args.Request as HttpWebRequest).ClientCertificates.Add(X509Certificate.CreateFromCertFile(@"C:\Localhost.cer"););
    }

создать сертификат на сервере, а затем установить его на клиенте?

1 Ответ

1 голос
/ 07 апреля 2011

Я думаю, что ваши сертификаты могут быть неправильными, но начните с проверки в IIS, что для «Сертификатов клиента» в разделе «Настройки SSL» для веб-сайта установлено значение «Принять» или «Требовать» (в зависимости от того, что вам больше подходит).

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

Если это не поможет, я бы посмотрел на этот вопрос: Использование makecert для разработки SSL

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