[Обновить] - я прилагаю также полные конфигурационные файлы, для службы и для клиента (вне здесь, чтобы не затопить тему)
У меня ситуация почти такая же, как описанная в этом вопросе, однако мой вопрос несколько отличается.
- Я использую NetTcpBinding с безопасностью
установить значение TransportWithMessageCredential
- Я использую пароль / имя пользователя
учетные данные, заархивированные ASP.NET
поставщик
- Мой сервис размещен в Windows
Сервис
- У меня есть поведение в моей конечной точке
указанная аутентификация
revocationMode = "NOCHECK"
Требуется, чтобы служба предоставляла сертификат для аутентификации клиентов. Это нормально, я просто делаю:
<serviceCertificate findValue="***"
storeLocation="CurrentUser"
storeName="My"
x509FindType="FindByThumbprint"/>
Так вот, я немного подумал, что теперь у клиента будет
<identity>
<certificate encodedValue="encoded certificate"/>
</identity>
И он сможет проверить учетные данные службы , не установив этот сертификат в хранилище на клиентском компьютере .
Я был удивлен , узнав , что, хотя я устанавливаю учетные данные службы для сертификата, WSDL выставляет
<Identity>
<Dns>Foo</Dns>
</Identity>
Опять же, в сервисе я могу установить Identity для CertificateReference и подключить его к тому же сертификату, а затем WSDL представит идентификацию как X509Certificate, но когда я запускаю клиент, этот параметр игнорируется, и я получаю сообщение об ошибке:
System.ServiceModel.Security.SecurityNegotiationException:
Сертификат X.509 CN = xxx не находится в
магазин доверенных людей. X.509
сертификат CN = ххх строительство цепи
не удалось. Сертификат, который был использован
имеет цепочку доверия, которая не может быть
проверено. Заменить сертификат или
измените CertificateValidationMode.
Цепочка сертификатов обработана, но
завершается корневым сертификатом, который
не является доверенным поставщиком доверия.
Есть ли способ заставить клиента использовать это значение из конфигурации и работать без необходимости устанавливать сервисный сертификат (или его корневой) на клиентской машине?
[UPDATE]
Если для атрибута certificateValidationMode задано значение none, исключение исчезнет, но это неприемлемое решение с точки зрения безопасности.
Это заставляет клиента просто признать, что он получил «некоторый» сертификат, не вдаваясь в подробности. Это делает возможным весь диапазон атакующих людей. Он по-прежнему не будет проверять информацию, отправленную (предполагаемой) службой, по сертификату, сброшенному в конфигурации.