Вызов WCF, когда Fiddler On, иначе дает 400 Bad Request во время отладки

Не разрешено - все еще ищет решение.

Я делаю передачу вызова WCF в токене SAML:

Использование токена SAML с веб-службой (wsdl)

private static string serviceEndpoint = "https service endpoint";
    public static void CallProviderService(SecurityToken token)
    {
        var binding = new WS2007FederationHttpBinding(WSFederationHttpSecurityMode.TransportWithMessageCredential);
        binding.Security.Message.EstablishSecurityContext = false;
        binding.Security.Message.IssuedKeyType = SecurityKeyType.BearerKey;

        var channelFactory = new ChannelFactory<ISomeProviderService>(binding, new EndpointAddress(new Uri(serviceEndpoint)));
        string thumb = "mycertthumbprint";
        channelFactory.Credentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindByThumbprint, thumb);
        channelFactory.Credentials.ServiceCertificate.Authentication.CertificateValidationMode = System.ServiceModel.Security.X509CertificateValidationMode.PeerOrChainTrust;
        channelFactory.ConfigureChannelFactory();
        channelFactory.Credentials.SupportInteractive = false;

var elements = service.Endpoint.Binding.CreateBindingElements();
elements.Find<SecurityBindingElement>().EnableUnsecuredResponse = true;
service.Endpoint.Binding = new CustomBinding(elements);

        var channel = channelFactory.CreateChannelWithIssuedToken<ISomeProviderService>(token);

        try
        {
            var response = channel.MyServiceMethod(somedataobject);
        }

        catch (Exception ex)
        {
           //log message
        }
    }

Когда у меня был скрипач, выполнявший вызов, он нашел и вернул мне данные.

С отключением fiddler я получаю ошибку 400 Bad Request в моем блоке catch.

Я сомневаюсь, что сертификат не передается, когда Fiddler выключен.

Любая идея?

Примечание. У меня есть .wsdl, который я использовал для создания прокси-классов с помощью Visual Studio → Добавить ссылку на службы.

Вопрос: Как проверить, установлен ли мой установленный сертификат при выполнении этого вызова службы https?

Обновлено: Вот Req/Response от Fiddler:

Запрос туннеля: Tunnel Request

Ответ туннеля: Tunnel Response

Сведения об исключении протокола:

enter image description here

От клиента после запроса сертификата сервера: enter image description here

Обновление 12/8/2014: Я думаю, что у меня есть один раз, используя привязку в этой ссылке: привязка WCF, которая будет поддерживать HTTPS, подписанный сертификат и подписанный токен имени пользователя

Я буду обновлять больше, поскольку я не знаю, что это делает.

Ответ 1

Из-за очень большого количества сценариев (и вопросов), подобных этим, Эрик Лоуренс написал сообщение в блоге - Справка! Запуск Fiddler Fixes My App???, только для этого.

Следующий раздел из сообщения, кажется, имеет отношение к вашей проблеме -


Проблемы с HTTPS

Некоторые пользователи считают, что трафик HTTPS работает только тогда, когда Fiddler запускает и расшифровывает безопасный трафик.

Ошибки сертификата

По умолчанию Fiddler предупреждает вас о недопустимых сертификатах при подключении к сайтам HTTPS:

Смотрите изображение в оригинальном посте

Если вы решите проигнорировать это предупреждение, Fiddler будет эффективно "скрывать" ошибку сертификата от клиентского приложения, так что он видит только сертификат Fiddler, сгенерированный для перехвата HTTPS.

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

Смотрите изображение в оригинальном посте

... но многие приложения будут терпеть неудачу или с запутанным сообщением об ошибке. Даже в браузере иногда не отображается сообщение об ошибке (например, при использовании XmlHttpRequest).

Исправление здесь простое: исправьте или замените сертификат серверов.

Ответ 2

Проверка сертификата.

Есть потенциально два клиентских сертификата. Используемый в сеансе TLS и тот, который используется в сообщении SAML Token/SOAP. Как правило, это тот же сертификат. Но добавлены разные части кода.

Fiddler знает только о сертификате TLS. Если бы вам пришлось добавить сертификат клиента TLS для скрипача, то это действительно так. Тест прост, удалите его из каталога Fiddler. Если он перестанет работать...

Если вы хотите увидеть сертификат клиента TLS, вы можете сделать трассировку с помощью своего любимого средства трассировки сети (NetMon, MessageAnalyser, WireShark, что угодно). Поместите его на исходящий сетевой адаптер и посмотрите на разницу в сообщениях TLS. Вероятно, вам придется предоставить секретный ключ инструменту трассировки. Поскольку сертификат клиента обменивается, когда он уже зашифрован.....

Другой вариант - использовать построенный в Schannel трассировку, но я не успел выяснить, как это работает, потому что трассировка сети всегда была возможной в моих тестовых средах.

Ответ 3

Можете ли вы переключить режим проверки сертификата из следующих параметров и попробовать -

  • ChainTrust
  • Нет
  • PeerOrChainTrust
  • PeerTrust