Использование клиентских сертификатов для аутентификации - PullRequest
2 голосов
/ 01 декабря 2011

Клиентский компьютер имеет сертификат «TicketSalesClient» в «Моем» хранилище текущего пользователя и сертификат «TicketSalesServer» в хранилище «TrustedPeople» текущего пользователя. Серверный компьютер имеет сертификат «TicketSalesClient» в хранилище «TrustedPeople» локального компьютера и сертификат «TicketSalesServer» в хранилище «My» локального компьютера.

Служба работает под управлением IIS 7. Ниже приведен файл web.config:

<system.serviceModel> 
<services>
  <service behaviorConfiguration="secureBehavior" name="InternetRailwayTicketSales.TicketSalesImplementations.TicketSalesService">
    <endpoint address="TicketSalesService" 
              binding="basicHttpBinding" 
              bindingConfiguration="secureHttpBinding" contract="InternetRailwayTicketSales.TicketSalesInterface.ITicketSales" />

    <endpoint address="TicketSalesServiceSecureMex" 
              binding="basicHttpBinding" 
              bindingConfiguration="secureHttpBinding" 
              contract="IMetadataExchange" />

    <host>
      <baseAddresses>
        <add baseAddress="https://localhost:443/TicketSales/" />            
      </baseAddresses>
    </host>

  </service>
</services>
<bindings>
  <basicHttpBinding>
    <binding name="secureHttpBinding">
      <security mode="Transport">
        <transport clientCredentialType="Certificate"/>
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

<behaviors>
  <serviceBehaviors>
    <behavior name="secureBehavior">
      <serviceThrottling maxConcurrentInstances="5000" maxConcurrentSessions="5000" />
      <serviceMetadata httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="True" />
      <serviceCredentials>
        <serviceCertificate findValue="TicketSalesServer" 
                            storeLocation="LocalMachine"
                            storeName="My"
                            x509FindType="FindBySubjectName"/>
        <clientCertificate>
          <authentication certificateValidationMode="PeerTrust"/>
        </clientCertificate>
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>

Служба в IIS настроена на использование SSL и сертификатов.

1) Теперь, когда я пытаюсь добавить сервисную ссылку в клиент, я получаю: «HTTP-запрос был запрещен с помощью схемы аутентификации клиента« Anonymous ». Удаленный сервер возвратил ошибку: (403) Forbidden».

2) Если я пытаюсь запросить конечную точку метаданных с помощью браузера, я сначала применяю сертификат SSL, а затем получаю сообщение об ошибке «Учетные данные не дают права на просмотр этого каталога или страницы». Насколько я понимаю, это потому, что я не могу предоставить учетные данные клиента через браузер.

3) Я пытался использовать svcutil с файлом конфигурации, который содержит учетные данные клиента:

    <configuration>
  <system.serviceModel>
    <client>
      <endpoint 
        behaviorConfiguration="ClientCertificateBehavior"
        binding="basicHttpBinding"
        bindingConfiguration="Binding1" 
        contract="IMetadataExchange"
        name="https" />
    </client>
    <bindings>
      <basicHttpBinding>
        <binding name="Binding1">
          <security mode="Transport">
            <transport clientCredentialType="Certificate" />
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <behaviors>
      <endpointBehaviors>
        <behavior name="ClientCertificateBehavior">
          <clientCredentials>
            <clientCertificate findValue="TicketSalesClient"
                               storeLocation="CurrentUser"
                               storeName="My"
                               x509FindType="FindBySubjectName" />
          </clientCredentials>
        </behavior>
      </endpointBehaviors>
    </behaviors>
  </system.serviceModel>
    </configuration>

А потом:

svcutil https://veryLongAddress.svc? Wsdl /config:svcutilConf.config

А ответ таков: «Основное соединение было закрыто: не удалось установить доверительные отношения для безопасного канала SSL / TLS. Удаленный сертификат недействителен в соответствии с процедурой проверки»

Так что я делаю не так?

Ответы [ 3 ]

1 голос
/ 01 декабря 2011

Похоже, что ваши сертификаты установка в порядке. Можете ли вы попробовать, как показано ниже, и увидеть вывод. Попробуйте перейти к сервису из IE, и вы сможете увидеть сервис и его wsdl.

Перейти к IE, а затем

Сервис -> Свойства обозревателя -> Безопасность -> Интернет -> Пользовательский уровень

Сервис -> Свойства обозревателя -> Безопасность -> Интранет -> Пользовательский уровень

Теперь прокрутите вниз до раздела «Разное», чтобы найти опцию «Не запрашивать запрос на выбор сертификата клиента, если сертификат отсутствует или присутствует только один сертификат».

Теперь перезапустите IE и перейдите к службе, и IE должен попросить вас выбрать сертификат клиента из личного хранилища, а вам нужно выбрать mvc.localhost.

Если сертификат TicketSalesClient не виден, значит, ваш сертификат клиента отсутствует в соответствующем магазине.

Причина этого в том, что файл, который вы используете для установки сертификатов, имеет значение, а также цель, для которой был создан сертификат. Назначение каждого сертификата можно найти, дважды щелкнув его в хранилище сертификатов, в котором есть столбец с именем «Назначение». Убедитесь, что это ваш сертификат клиента.

0 голосов
/ 09 августа 2016

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

0 голосов
/ 01 декабря 2011

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

  <basicHttpBinding>
    <binding name="secureHttpBinding">
      <security mode="Transport">
        <transport clientCredentialType="Certificate" />
      </security>
    </binding>
  </basicHttpBinding>
  <customBinding>
    <binding name="wsdlBinding">
      <textMessageEncoding messageVersion="None" />
      <httpsTransport requireClientCertificate="true" />
    </binding>
  </customBinding> 

А в поведении службы используйте:

  <serviceMetadata httpsGetEnabled="true" 
                   httpsGetBinding="customBinding" 
                   httpsGetBindingConfiguration="wsdlBinding" />

Это должно заставить WSDL получить сертификат клиента, и он "должен" работать из браузера (если нет другой проблемы).

...