Самостоятельная служба WCF с взаимным SSL (между службой и клиентом) завершается с 403 Запрещено
Я пытаюсь настроить демонстрацию Mutual SSL междурезидентных Служба WCF и клиентское приложение (пока командная строка). В конце концов я пытаюсь найти решение, где у меня естьтранспортная безопасность (не безопасность сообщений) между сервером, который использует сертификат для своих входящих подключений, и несколькими клиентами, каждый из которых имеет отдельные сертификаты, которые я могу использовать для уникальной идентификации каждого из клиентов.
Я попробовал несколько разных подходов к этому, но ни один из них не сработал (я не смог найти точный пример того, что я пытался сделать). Каждый раз, когда я думаю, что я сближаюсь, я получаю исключение в клиенте, когда пытаюсь вызвать службу. Наиболее распространенное исключение, с которым я столкнулся:
“The HTTP request was forbidden with client authentication scheme 'Anonymous'.”
Inner exception: "The remote server returned an error: (403) Forbidden."
У кого-нибудь есть мысли о том, что я мог сделать неправильно или, возможно, лучше узнать, как настроить взаимный SSL в вышеуказанном сценарии?
Полное раскрытие информации - на данный момент я использую и клиент, и сервер на одном компьютере. Не уверен, что это имеет значение.
Конфигурационные фрагменты ниже
Код сервиса и клиента относительно тривиален, поэтому я уверен, что заставил их работать. Конфиги приложения (в частности, привязки и поведение) и сертификаты «более интересны», поэтому я не уверен в этом.
Как я создал сертификаты (дословные команды)
makecert -pe -n "CN=SelfSignedCA" -ss Root -sr LocalMachine -a sha1 -sky signature -r -sv "SelfSignedCA.cer" "SelfSignedCA.pvk"
makecert -pe -n "CN=system" -ss my -sr LocalMachine -a sha1 -sky exchange -eku 1.3.6.1.5.5.7.3.1 -in "SelfSignedCA" -is Root -ir LocalMachine -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 Service.cer
makecert -pe -n "CN=client1" -ss my -sr LocalMachine -a sha1 -sky exchange -eku 1.3.6.1.5.5.7.3.1 -in "SelfSignedCA" -is Root -ir LocalMachine -sp "Microsoft RSA SChannel Cryptographic Provider" -sy 12 Client1.cer
Связывание сертификата с портом (дословные команды)
netsh http add urlacl url=https://+:44355/MyService/ user=EVERYONE
Настройки сервера
Наручники:
<wsHttpBinding>
<binding name="CustomBinding">
<security mode="Transport">
<transport clientCredentialType="Certificate"/>
</security>
</binding>
</wsHttpBinding>
поведения:
<serviceBehaviors>
<behavior name="">
<!--
<serviceCredentials>
<serviceCertificate
findValue="system"
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindBySubjectName"/>
</serviceCredentials>
-->
<serviceAuthorization
serviceAuthorizationManagerType=
"ClientAuthorization.ClientCertificateAuthorizationManager, Simulator.Service.SideA" />
</behavior>
</serviceBehaviors>
клиент
Наручники:
<wsHttpBinding>
<binding name="CustomBinding">
<security mode="Transport">
<transport clientCredentialType="Certificate"/>
</security>
</binding>
</wsHttpBinding>
поведения
<endpointBehaviors>
<behavior name="ChannelManagerBehavior">
<clientCredentials>
<clientCertificate findValue="client1"
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindBySubjectName" />
<!--
<serviceCertificate>
<authentication certificateValidationMode="PeerOrChainTrust"/>
</serviceCertificate>
-->
</clientCredentials>
</behavior>
</endpointBehaviors>
ОБНОВИТЬ
Поэтому я добавил на сервер пользовательский валидатор имени пользователя и пароля, пытаясь переопределить поведение по умолчанию и всегда разрешать независимо от представленных учетных данных (опять же, я действительно не хочу проверять логин / пароль).Этот валидатор никогда не вызывается. Клиент по-прежнему получает исключение «Анонимная схема аутентификации».
Обновление поведения службы
<serviceCredentials>
<userNameAuthentication
userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType=
"Service.ClientAuthorization.ClientUserNamePasswordValidatorManager, Service.SideA" />
</serviceCredentials>