Как настроить службу WCF для приема только одного клиента, идентифицированного сертификатом x509 - PullRequest
4 голосов
/ 17 февраля 2010

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

На сервере есть сертификат, выданный server.mydomain.com, установленный в локальном компьютере / личном хранилище, и у клиента есть сертификат, выданный client.mydomain.com, установленный в том же месте.,В дополнение к этому у сервера есть общедоступный сертификат клиента в «Локальный компьютер / доверенные люди», а у клиента есть общедоступный сертификат сервера в «Локальный компьютер / доверенные люди».

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

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

Правильная информация доступна насервер использует 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>

Ответы [ 2 ]

2 голосов
/ 08 апреля 2010

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

Я закончил тем, что добавил поведение с этим тегом:

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

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

1 голос
/ 17 февраля 2010

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

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

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

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

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

...