BasicHttpBinding с использованием безопасности транспорта с самоподписанным сертификатом

У меня есть служба WCF, использующая как BasicHttpBinding, так и NetTcpBinding на разных конечных точках в одном ServiceHost. NetTcp использует самоподписанный сертификат, который загружается из файла, все было хорошо, пока я не попытался использовать BasicHttpBinding, поэтому я делаю:

На сервере:

var ServiceHost host = new ServiceHost(blah blah);
host.Credentials.ServiceCertificate.Certificate = GetCertificate(); //load a certificate from file
host.Credentials.ClientCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
var httpBinding = new BasicHttpBinding();
httpBinding.Security.Mode = BasicHttpSecurityMode.Transport;
httpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;

На клиенте:

ChannelFactory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None;
var cer = GetCertificate();
ChannelFactory.Credentials.ClientCertificate.Certificate = cer;

var httpBinding = new BasicHttpBinding();
httpBinding.Security.Mode = BasicHttpSecurityMode.Transport;
httpBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;
//accept any cert
System.Net.ServicePointManager.ServerCertificateValidationCallback =
                ((sender, certificate, chain, sslPolicyErrors) => true);

Однако при подключении я получил эту ошибку

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

сертификат не установлен, и он отлично работал с привязкой net tcp, наверное, я что-то пропустил?

Я заметил одну вещь: net.tcp - это дуплексный канал, а базовый http - симплексный, я уверен, что есть разница в настройке? Например, мне нужно было загрузить сертификат на обоих концах для net.tcp, что тогда происходит с базовым http?

заранее спасибо


person Yuan    schedule 21.04.2011    source источник
comment
Вы пытались просмотреть URL-адрес https в браузере. Показывает ли он страницу справки WCF.   -  person Chandermani    schedule 21.04.2011
comment
Нет, я думаю, что мой сертификат настроен неправильно, но не могу найти, где :(   -  person Yuan    schedule 21.04.2011
comment
Проверьте codeproject.com/KB/WCF/WCFSSL.aspx, если вы используете хостинг без IIS. Возможно, вы не настроили сертификат.   -  person Chandermani    schedule 21.04.2011


Ответы (1)


Сертификат для HTTPS не настроен в конфигурации WCF. Вы должны настроить сертификат для http.sys. Для этого используйте netsh.exe из командной строки с повышенными привилегиями. Если вы размещаете службу в IIS/WAS, вам не нужно использовать netsh, и вы можете настроить HTTPS непосредственно в IIS.

person Ladislav Mrnka    schedule 21.04.2011
comment
Причина, по которой я загружаю из файла (на самом деле файл находится в памяти), заключается в том, что я стараюсь избегать командной строки, поскольку они сложнее, чем настроены в коде, и действительны только до закрытия моей службы. Также есть проблема с общим доступом к порту, если я привязываю сертификат к порту. - person Yuan; 21.04.2011
comment
@Yuan: HTTPS предоставляется http.sys — это драйвер ядра Windows со своими требованиями. Если вы хотите использовать HTTPS, вы должны установить сертификат в хранилище сертификатов и зарегистрировать его с помощью netsh. Вы можете сделать это как пользовательское действие в установщике приложения. - person Ladislav Mrnka; 21.04.2011
comment
Кажется, на msdn.microsoft.com/en-us/library/ms733791.aspx все объясняет, не очень приятно настраивать сертификат на привязку И устанавливать настройку в HTTP.SYS , вы сэкономили мне много времени, спасибо! - person Yuan; 22.04.2011
comment
Последняя ссылка битая. - person Nick; 13.11.2013