Я создаю простой сервис 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 );
Любая помощь по правильной настройке будет принята с благодарностью.