Self-Hosted Wcf Service с проверкой подлинности клиента сертификата - PullRequest
0 голосов
/ 26 мая 2019

У меня есть собственный wcf-сервис, который использует wsHttpBinding с безопасностью транспорта.Я хочу, чтобы служба аутентифицировала клиента с помощью сертификата.

Когда клиент связывается со службой с помощью clientCredentialsType, для которого установлено значение «Нет», все работает нормально.Сертификат был создан с помощью OpenSSL (самоподписанный) и зарегистрирован с помощью netsh на определенном порту.Имя сертификата - DomainName (имя компьютера в моем случае).

Обновление
Я создал сертификаты для клиента и сервера и поместил их в хранилища доверенных корней друг друга (сертификат сервера в хранилище клиента и наоборот).

Я прочитал много статей и других вопросов в SOF, но даже те, которые выглядят актуально, не могли помочь мне решить проблему.

Текущая конфигурация

Служба

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="serviceBehavior">
          <serviceMetadata httpsGetEnabled="true" httpGetEnabled="false" />
          <serviceDebug includeExceptionDetailInFaults="true" httpsHelpPageEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <bindings>
      <wsHttpBinding>
        <binding name="httpsBinding" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" sendTimeout="01:00:00">
          <security mode="Transport" >
            <transport clientCredentialType="Certificate"/>
          </security>
        </binding>
      </wsHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="serviceBehavior" name="Service">
        <endpoint binding="wsHttpBinding" bindingConfiguration="httpsBinding" contract="SomeNamespace.IService"/>
        <host>
          <baseAddresses>
            <add baseAddress="https://domain:port/Something/"/>
          </baseAddresses>
        </host>
      </service>
    </services>    
  </system.serviceModel>

Клиент

<system.serviceModel>  
    <client>  
      <endpoint address="https://domain:port/Something/"   
                behaviorConfiguration="endpointCredentialBehavior"  
                binding="wsHttpBinding"   
                bindingConfiguration="Binding"   
                contract="SomeNamespace.IService"/>  
    </client>  
    <behaviors>  
      <endpointBehaviors>  
        <behavior name="endpointCredentialBehavior">  
          <clientCredentials>  
            <clientCertificate findValue="DomainName"  
                               storeLocation="LocalMachine"  
                               storeName="My"  
                               x509FindType="FindBySubjectName" />  
          </clientCredentials>  
        </behavior>  
      </endpointBehaviors>  
    </behaviors>  
    <bindings>  
      <wsHttpBinding>         
        <binding name="Binding">  
          <security mode="Transport">  
            <transport clientCredentialType="Certificate"/>  
          </security>  
        </binding>  
      </wsHttpBinding>  
    </bindings>  
  </system.serviceModel>  

Я получаю следующее исключение:

System.ServiceModel.Security.MessageSecurityException: HTTP-запрос был запрещен в схеме аутентификации клиента «Аноним».---> System.Net.WebException: удаленный сервер возвратил ошибку: (403) Запрещено.в System.Net.HttpWebRequest.GetResponse () в System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply (время ожидания TimeSpan)

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

ваш файл конфигурации выглядит нормально. У меня та же проблема с моим сторонним клиентским сертификатом (открытым ключом), независимо от того, где я добавлю, что сертификат все еще не работает. Однако мне удалось заставить его работать с моим самозаверяющим клиентским сертификатом. Мне просто нужно было добавить сертификат CA клиента в доверенные корневые центры сертификации на сервере.

Мне показалось, что эти две темы полезны при определении некоторых проблем: Взаимная аутентификация с WCF, размещенным на IIS WCF - двусторонняя защита SSL с использованием сертификатов

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

0 голосов
/ 27 мая 2019

Есть еще одна вещь, которую нам нужно сделать.Мы должны сделать их сертификаты доверенными друг другу.сертификат сервера должен быть доверенным клиентом, а сертификат клиента должен быть доверенным сервером.
В частности, сертификат сервера установлен в клиентских доверенных корневых центрах сертификации, клиентский сертификат установлен на сервере доверенных корневых центров сертификации.,Лучше всего использовать локальное хранилище сертификатов машины.Мы могли бы проверить сертификат, используя команду Certlm.msc.
enter image description here Пожалуйста, обратитесь к официальному документу относительно этой проблемы.
https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/transport-security-with-certificate-authentication
Для некоторых специальных сертификатов созданодругими специальными инструментами, такими как PowerShell, нам лучше сделать целевую среду проекта (сервер и клиент) выше 4.6.2.
https://github.com/dotnet/docs/issues/12000
Не стесняйтесь, дайте мне знать, если есть что-то, что я могупомогите.

...