Сценарий таков: на разных машинах развернуто 2 веб-службы WCF, один клиент (WCFClient), один сервер (WCFServer). Мне нужно было сертификатное соединение между ними.
На сервере WCF я установил привязку для использования сертификатов в качестве типа учетных данных клиента.
<security mode="Message">
<message clientCredentialType="Certificate" />
</security>
Также в разделе поведения, среди прочих настроек, у меня есть
<serviceBehaviors>
<behavior name="Server.ServiceBehavior">
<serviceCredentials>
<clientCertificate>
<authentication certificateValidationMode="PeerTrust"/>
</clientCertificate>
<serviceCertificate findValue="Server"
storeLocation="LocalMachine"
storeName="TrustedPeople"
x509FindType="FindBySubjectName" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
На клиентской службе WCF я добавил это поведение конечной точки
<endpointBehaviors>
<behavior name="CustomBehavior">
<clientCredentials>
<clientCertificate findValue="Client"
x509FindType="FindBySubjectName"
storeLocation="LocalMachine"
storeName="TrustedPeople" />
<serviceCertificate>
<authentication certificateValidationMode="PeerTrust"/>
</serviceCertificate>
</clientCredentials>
</behavior>
</endpointBehaviors>
Когда я хотел проверить свои услуги, у меня было сообщение об ошибке:
The service certificate is not provided for target 'http://blablabla...'. Specify a service certificate in ClientCredentials.
Так что я начал проверять вещи в Интернете. После многих попыток единственное, что на самом деле сработало, это добавило это на мой клиент:
<serviceCertificate>
<defaultCertificate findValue="Server"
storeLocation="LocalMachine"
storeName="TrustedPeople"
x509FindType="FindBySubjectName" />
<authentication certificateValidationMode="PeerTrust"/>
</serviceCertificate>
Как вы можете подумать, да, это означает, что мне нужен сертификат сервера на моем клиентском компьютере. Что явно очень плохо.
Он работает в целях тестирования, но неприемлем для развертывания.
Я бы хотел понять, что на самом деле может вызвать это сообщение об ошибке и какое может быть решение.
Позднее редактирование: в этом проекте у клиента не должно быть сертификата сервера (даже без закрытого ключа). Это спецификация системы, и довольно сложно (в терминах bureaucracy
) выйти за пределы этого.
Будет несколько клиентов, каждый с запущенной службой WCF клиента, и каждый не должен знать ничего больше, чем их собственный сертификат. Сервер будет знать сертификат сервера и все сертификаты клиентов.