#wcf #security #self-hosting #netsh
Вопрос:
У меня есть автономная служба, в которую я хочу добавить безопасность транспорта. Я установил привязку wsHttpBinding.SecurityMode для транспорта и clientCredentialType для HttpClientCredentialType.Нет. Я создал сертификат и установил его на своем хосте с помощью ServiceHost.Полномочия.Сертификат обслуживания.setCertificate() Я также зарегистрировал его с помощью netsh http add sslcert ipport=127.0.0.1:80 certh=[MyCertHash] certstorename=МОЙ идентификатор приложения=[Идентификатор приложения] верифицированиеclientcertrevocation=отключить
Я получаю следующее сообщение об ошибке всякий раз, когда пытаюсь вызвать службу: «Проверка подлинности не удалась, потому что удаленная сторона закрыла транспортный поток».
Означает ли это, что клиент и сервер пытаются аутентифицировать друг друга? Как я могу отключить его? Чтобы прояснить ситуацию, я не хочу устанавливать сертификат на клиенте, я не ищу никакого банкомата для аутентификации, просто защищаю содержимое сообщений, если это вообще возможно.
Комментарии:
1. Добавьте ведение журнала на свой сервер WCF и используйте средство просмотра трассировки служб из Vista SDK, чтобы узнать, в чем именно заключается ошибка! Не упускайте из виду вероятность того, что ошибка содержится в вашем коде.
2. Сервис прекрасно работает без транспортной безопасности.
Ответ №1:
Это сообщение MSDN может помочь решить вашу проблему. Первоначальный запрос в сообщении заключается в настройке режима безопасности, отличного от вашего, но они переключаются в режим транспорта для устранения неполадок, и эта информация должна относиться к вашей ситуации.
Если то, что вы описываете, — это все, что вы сделали для установки сертификата, то вам не хватает нескольких шагов. В этом сообщении описан процесс установки действительного сертификата. Удачи!!
Комментарии:
1. Спасибо, но я использую сертификат не для аутентификации, а только для шифрования, так что это совсем другой сценарий. В любом случае, я добавил сертификат доверенным лицам, но это не помогло.
Ответ №2:
Сертификаты иногда могут быть занозой в заднице, чтобы начать работать. Первое, что вы всегда должны делать с WCF, — это включать трассировку:
http://msdn.microsoft.com/en-us/library/ms733025.aspx
Затем вы можете использовать SvcTraceViewer для просмотра исключений, которые ваша служба генерирует за кулисами, и получить некоторое представление о том, что происходит, что необходимо для решения многих проблем WCF. В 9 случаях из 10 трассировка расскажет вам все, что вам нужно знать.
Кроме того, убедитесь, что сертификат настроен как на клиенте, так и на сервере, так как сертификат должен быть установлен на обеих машинах.
Ответ №3:
Я пытался отследить ту же ошибку и наткнулся на этот пост. Трассировка WCF не помогает, так как ошибка появляется на стороне клиента в стеке HTTP, а на стороне сервера запрос отклоняется до того, как он попадет на уровень WCF.
Я обнаружил, что был недостаточно внимателен. Убедитесь, что выполнены все следующие условия. У меня было несколько, но не все из них были правильно настроены:
- У эмитента сертификата сервера есть действительный и соответствующий доверенный корневой центр сертификации, выдающий сертификат на том же компьютере.
- Имя субъекта сертификата сервера точно совпадает с именем машины, и имя машины, к которой обращается клиент, также совпадает («локальный
Environment.MachineName
хост» и значение сервера). - Отпечаток сертификата сервера был установлен администратором с помощью следующей команды (используйте
netsh
эквивалент для более новых версий Windows).httpcfg set ssl -i 0.0.0.0:{port} -h {thumbprint}
- Этот клиент также имеет такой же действительный сертификат корневого центра сертификации, выданный на клиентском компьютере.
Вот хорошая ссылка: SSL с автономной службой WCF.