У меня есть конкретная проблема, которую я не могу решить.Позвольте мне объяснить подробно.Я новичок в этой технологии, поэтому я могу использовать некоторые неправильные термины.Пожалуйста, исправьте и объясните или попросите объяснения, если вы не понимаете.Я создаю собственный сервер WCF REST, размещенный в приложении WPF.Он использует https, SLL с WebHttpSecurityMode.Transport.Я использую свой собственный сгенерированный сертификат.Я хотел бы создать клиент WinForms, который будет использовать этот сервис.Формат ответа сервера - JSON.Я хотел бы проверить сертификат на клиенте с помощью моего пользовательского валидатора, унаследованного от X509CertificateValidator.
Это мой код на стороне сервера.Я использую пользовательский валидатор имени пользователя, который работает нормально.Я настроил сертификат в диспетчере IIS на своем компьютере для веб-сайта по умолчанию> Привязки, где я сгенерировал сертификат (Windows 7).
WebServiceHost sh = new WebServiceHost(typeof(ReachService));
string uri = "https://localhost:9000/Service";
WebHttpBinding wb = new WebHttpBinding();
wb.Security.Mode = WebHttpSecurityMode.Transport;
wb.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
sh.AddServiceEndpoint(typeof(IReachService), wb, uri);
sh.Credentials.UserNameAuthentication.CustomUserNamePasswordValidator = new CustomUserNameValidator();
sh.Credentials.UserNameAuthentication.UserNamePasswordValidationMode = UserNamePasswordValidationMode.Custom;
sh.Open();
, и это мой код клиента
Uri uri = new Uri("https://localhost:9000/Service");
WebChannelFactory<ReachService> cf = new WebChannelFactory<IReachService>(uri);
WebHttpBinding wb = cf.Endpoint.Binding as WebHttpBinding;
wb.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
wb.Security.Mode = WebHttpSecurityMode.Transport;
cf.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.Custom;
cf.Credentials.ServiceCertificate.Authentication.CustomCertificateValidator = new CustomCertificateValidator("PL2"); // this is the name that issued the certificate
cf.Credentials.UserName.UserName = "user1";
cf.Credentials.UserName.Password = "user1";
IReachService service = cf.CreateChannel();
try
{
CustomersList auth = service.GetCustomers();
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}
при вызове сервиса. GetCustomers () Я получаю: Не удалось установить доверительные отношения для безопасного канала SSL / TLS с полномочиями «localhost: 9000».Сообщение InnerException: базовое соединение было закрыто: не удалось установить доверительные отношения для безопасного канала SSL / TLS.InnerException Message: удаленный сертификат недействителен в соответствии с процедурой проверки.
Сервер работает нормально, когда я тестирую в браузере.Но клиентский код неверен, потому что он не переходит в пользовательский класс проверки сертификата.И этот класс такой же, как в примере MSDN на http://msdn.microsoft.com/en-us/library/system.identitymodel.selectors.x509certificatevalidator.aspx.
Может кто-нибудь сказать мне, где я ошибаюсь с этим подходом?
Если вам нужна дополнительная информация, пожалуйста, спросите.
Спасибо