Как настроить самодостаточный сервис https WCF со встроенными сертификатами на клиенте и сервере? - PullRequest
1 голос
/ 27 июля 2010

Я создаю простой сервис WCF для получения отчетов о сбоях.

Служба будет запущена как консольная программа и должна запускаться без установки сертификатов.

В плане безопасности мне нужно убедиться, что данные, отправленные клиентом, отправляются только на наш сервер и данные не перехватываются. С точки зрения сервера, я также хотел бы убедиться, что подключающийся клиент использует определенный сертификат (встроенный в клиентскую сборку) для предотвращения злоупотребления службой.

Я создал один самозаверяющий сертификат и планирую встроить .cer (содержащий открытую часть сертификата) в клиентскую сборку и встраивать PFX, содержащий сертификат с закрытым ключом, в сборку программы узла службы. ( это заставило меня поверить, что я могу использовать один сертификат).

Моя проблема в том, что независимо от того, как это настроить, я получаю следующую ошибку:

"Произошла ошибка при отправке HTTP-запроса на https://localhost:8080/errorservice. Это может быть связано с тем, что сертификат сервера неправильно настроен с HTTP.SYS в случае HTTPS. Это также может быть вызвано несоответствие привязки безопасности между клиентом и сервером. "

Не должно быть несоответствия между привязками, поскольку они созданы с использованием одного и того же кода:

</p> <pre><code>public static BasicHttpBinding CreateStreamingBinding() { BasicHttpBinding streamBinding = new BasicHttpBinding(); streamBinding.TransferMode = TransferMode.StreamedRequest; streamBinding.MaxReceivedMessageSize = long.MaxValue; streamBinding.Security = new BasicHttpSecurity { Transport = new HttpTransportSecurity { ClientCredentialType = HttpClientCredentialType.None, ProxyCredentialType =HttpProxyCredentialType.None }, Mode = BasicHttpSecurityMode.Transport, }; streamBinding.MaxBufferSize = int.MaxValue; streamBinding.MessageEncoding = WSMessageEncoding.Mtom; streamBinding.SendTimeout = new TimeSpan( 1, 0, 0, 0, 0 ); streamBinding.ReceiveTimeout = new TimeSpan( 1, 0, 0, 0, 0 ); return streamBinding; }

На клиенте код для создания службы настраивается следующим образом (местоположение сертификата только для тестирования):

</p> <pre><code>protected ErrorReportingServiceClient CreateClient() { X509Certificate2 cert = new X509Certificate2( @"C:\certs\reporting.cer" ); EndpointAddress endpointAddress = new EndpointAddress( new Uri( ReportingServiceUri )); ErrorReportingServiceClient client = new ErrorReportingServiceClient( CreateStreamingBinding(), endpointAddress ); client.ClientCredentials.ServiceCertificate.DefaultCertificate = cert; client.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None; client.ClientCredentials.ClientCertificate.Certificate = cert; return client; }

На стороне сервиса установка выглядит следующим образом:

</p> <pre><code> X509Certificate2 cert = new X509Certificate2( @"C:\certs\reporting.pfx", <password>); BasicHttpBinding basicHttpBinding = CreateStreamingBinding(); host.Credentials.ClientCertificate.Certificate = cert; host.Credentials.ClientCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None; host.Credentials.ServiceCertificate.Certificate = cert; host.AddServiceEndpoint( contractType, basicHttpBinding, baseAddress );

Любая помощь по правильной настройке будет принята с благодарностью.

1 Ответ

1 голос
/ 30 июля 2010

На вопрос ответили на форумах MSDN: http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/14f44296-5e3d-4df5-8cc4-a185415852b7

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...