Я хотел бы использовать шифрование и проверку на основе сертификатов при взаимодействии со службой WCF. Поэтому я создал тестовые сертификаты, «TempCA» в качестве моего корневого CA и «SignedByCA» в качестве клиентского сертификата, подписанного этим CA.
Когда я помещаю сертификат клиента в «Local Computer \ Trusted People» и использую certificateValidationMode="PeerTrust"
, служба распознает клиента, и все работает как положено. Но с проверкой цепочки доверия (certificateValidationMode="ChainTrust"
) я сталкиваюсь с ошибкой «Вызывающая сторона не была аутентифицирована службой».
Соответствующая конфигурация на стороне сервера:
<behaviors>
<serviceBehaviors>
<behavior name="customServiceBehavior">
[...]
<serviceCredentials>
<clientCertificate>
<authentication certificateValidationMode="ChainTrust" trustedStoreLocation="LocalMachine" mapClientCertificateToWindowsAccount="false" />
</clientCertificate>
<serviceCertificate findValue="TempCA"
storeLocation="LocalMachine"
storeName="My"
x509FindType="FindBySubjectName" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<wsHttpBinding>
<binding name="soapBindingConfiguration">
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
</binding>
</wsHttpBinding>
</bindings>
Соответствующая конфигурация клиента (остальные автоматически создаются с помощью «Добавить ссылку на службу»):
<endpointBehaviors>
<behavior name="customClientBehavior">
<clientCredentials>
<clientCertificate findValue="SignedByCA" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName" />
</clientCredentials>
</behavior>
</endpointBehaviors>
Как клиентские, так и серверные сертификаты хранятся со своим закрытым ключом в «Local Computer \ Personal» (потому что я тестирую на один компьютер), и «TempCA» (мой корневой сертификат) также в «Локальный компьютер \ доверенные корневые центры сертификации».
Что мне здесь не хватает? Есть рабочие примеры?