Автономная служба WCF с транспортной безопасностью (сбой проверки подлинности, поскольку удаленная сторона закрыла транспортный поток.)

#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.

Я обнаружил, что был недостаточно внимателен. Убедитесь, что выполнены все следующие условия. У меня было несколько, но не все из них были правильно настроены:

  1. У эмитента сертификата сервера есть действительный и соответствующий доверенный корневой центр сертификации, выдающий сертификат на том же компьютере.
  2. Имя субъекта сертификата сервера точно совпадает с именем машины, и имя машины, к которой обращается клиент, также совпадает («локальный Environment.MachineName хост» и значение сервера).
  3. Отпечаток сертификата сервера был установлен администратором с помощью следующей команды (используйте netsh эквивалент для более новых версий Windows).
     httpcfg set ssl -i 0.0.0.0:{port} -h {thumbprint}
     
  4. Этот клиент также имеет такой же действительный сертификат корневого центра сертификации, выданный на клиентском компьютере.

Вот хорошая ссылка: SSL с автономной службой WCF.