Как настроить службу WCF, чтобы принять только один клиент, идентифицированный сертификатом X509

StackOverflow https://stackoverflow.com/questions/2276594

Вопрос

У меня есть приложение WCF Client/Service, которое опирается на безопасную связь между двумя машинами, и я хочу использовать использование сертификатов X509, установленных в хранилище сертификатов для идентификации сервера и клиента друг другу. Я делаю это, настраивая привязку как <security authenticationMode="MutualCertificate"/>. Анкет Есть только клиентская машина.

Сервер имеет сертификат, выданный на Server.myDomain.com, установленного в локальном компьютере/персональном магазине, а клиент имеет сертификат, выданный на client.mydomain.com, установленном в том же месте. В дополнение к этому у сервера есть общедоступный сертификат клиента в локальном компьютере/доверенных людях, а клиент имеет общедоступный сертификат сервера в локальном компьютере/доверенных людях.

Наконец, клиент был настроен для проверки сертификата сервера. Я сделал это, используя system.servicemodel/behaviors/endpointBehaviors/clientCredentials/serviceCertificate/defaultCertificate элемент в файле конфигурации.

Пока все хорошо, все это работает. Моя проблема заключается в том, что я хочу указать в файле конфигурации сервера, что только клиенты, которые идентифицируют себя с Client.myDomain.com Сертификат из хранилища сертификатов Trusted People, разрешается подключаться.

Правильная информация доступна на сервере, используя ServiceSecurityContext, но я ищу способ указать на app.config, что WCF должен сделать эту проверку вместо того, чтобы проверить контекст безопасности из кода.

Это возможно? Любые подсказки будут оценены.

Кстати, файл конфигурации моего сервера пока выглядит так:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.serviceModel>
    <services>
      <service name="MyServer.Server" behaviorConfiguration="CertificateBehavior">
        <endpoint contract="Contracts.IMyService" binding="customBinding" bindingConfiguration="SecureConfig">
        </endpoint>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost/SecureWcf"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="CertificateBehavior">
          <serviceCredentials>
            <serviceCertificate storeLocation="LocalMachine" x509FindType="FindBySubjectName" findValue="server.mydomain.com"/>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <customBinding>
        <binding name="SecureConfig">
          <security authenticationMode="MutualCertificate"/>
          <httpTransport/>
        </binding>
      </customBinding>
    </bindings>
  </system.serviceModel>
</configuration>
Это было полезно?

Решение

Похоже, нет способа сделать то, что я хочу, используя web.config.

В итоге я добавил поведение с этим тегом:

<clientCertificate>
  <authentication certificateValidationMode="PeerTrust" trustedStoreLocation="CurrentUser" revocationMode="NoCheck"/>
</clientCertificate>

А затем добавьте сертификат клиента в хранилище сертификата «Доверенных людей» пользователя, который сервер работает как.

Другие советы

Проверьте Руководство по безопасности WCF Страница на Codeplex - отличные и очень полезные вещи!

В частности, проверьте практические значения и даже более конкретно

Как - использовать аутентификацию сертификата и безопасность сообщений в вызове WCF из форм Windows

Он отлично объясняет, как настроить услугу WCF, которая требует от его клиентов представить действительный сертификат, и как это проверить. Если вы хотите разрешить только одного клиента, разверните этот сертификат только для этого одного клиента.

Надеюсь это поможет!

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top