У меня есть собственный 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)