Silverlight 4 OOB + стек HTTP браузера + сертификаты клиента = FAIL? - PullRequest
4 голосов
/ 08 июля 2010

У меня возникла проблема, из-за которой IIS 7.5 (в Windows 7 64-bit) не работает, когда я вызываю его из приложения Silverlight 4 без браузера, используя SSL и сертификат клиента, с сообщением «I / Операция O была прервана из-за выхода из потока или запроса приложения. (0x800703e3) ". Запрос действительно делает это к IIS. Вот пример из трассировки неудачного запроса:

Операция ввода-вывода была прервана из-за выхода из потока или запроса приложения. (0x800703e3) http://www.slipjig.org/IISError.gif

Я использую стек HTTP браузера, поскольку клиентский стек HTTP не поддерживает клиентские сертификаты. Клиентский код, пытающийся попасть на сервер, является загрузчиком модуля Prism. Если я запускаю приложение вне браузера, но игнорирую клиентские сертификаты, или если я запускаю приложение в браузере, но требую клиентские сертификаты, оно работает нормально. Кажется, это сочетание двух факторов, вызывающих проблему.

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

  • Использовал Fiddler для просмотра ошибочного запроса. Это работает, если Fiddler работает (предположительно, потому что Fiddler обрабатывает сертификат клиента по-другому?);
  • Создана веб-форма .aspx для обслуживания модуля .xaps;
  • Создал HTTPModule, чтобы посмотреть, смогу ли я перехватить запрос до того, как он не выполнен;
  • Использовал анализатор пакетов, чтобы узнать, могу ли я сказать, правильно ли отправляется сертификат клиента.

Ничто из вышеперечисленного не дало мне много полезной информации помимо того, что я мог видеть в файле трассировки, хотя Fiddler интересен.

Есть идеи? Заранее спасибо! Майк

Ответы [ 4 ]

4 голосов
/ 14 августа 2010

Я недолго бился головой об стену из-за этой проблемы. Вот то, что я узнал и как я наконец обошел это.

Класс Prism FileDownloader использует System.Net.WebClient для загрузки модулей. В режиме OOB WebClient, похоже, использует тот же стек, что и IE, но, по-видимому, либо не отправляет сертификат клиента, либо (что более вероятно) неправильно согласовывает рукопожатие сертификата SSL / клиента с сервером. Я говорю это потому что:

  • Мне удалось успешно запросить файлы .xap с помощью Firefox и Chrome;
  • Я не смог успешно запросить файлы .xap с помощью IE;
  • IIS потерпит неудачу с 500, а не с 403.

Я не мог понять, что на самом деле происходит по проводам; если бы я использовал Fiddler, он бы работал, потому что Fiddler перехватывает связь с сервером и обрабатывает рукопожатие сертификата клиента. И попытка использовать перехватчик пакетов, очевидно, ничего не скажет из-за SSL.

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

Когда это не сработало, я попытался изменить исходный код Prism, чтобы использовать стек HTTP браузера вместо WebClient. Для этого я создал новый класс, похожий по дизайну на FileDownloader, реализующий IFileDownloader, который использовал стек браузера. Затем я внес некоторые изменения в XapModuleTypeLoader (который создает экземпляр загрузчика), чтобы он использовал новый класс. Этот подход не удался с той же ошибкой, с которой я первоначально столкнулся.

Затем я начал исследовать, доступен ли коммерческий стек HTTP сторонних производителей. Я нашел тот, который поддерживал нужные мне функции и поддерживал среду выполнения Silverlight 4. Я создал другую реализацию IFileDownloader, которая использовала этот стек, и BOOM - это сработало.

Хорошей новостью этого подхода является то, что я могу не только использовать его для загрузки модулей, но также использовать его для защиты связи между клиентом и нашим REST API (преимущество, которое мы собирались отказаться до этого).

Я планирую отправить патч в Prism, чтобы позволить загрузчику быть зарегистрированным или привязанным извне, поскольку в настоящее время он жестко запрограммирован на использование собственного FileDownloader. Если кто-то заинтересован в этом или в коммерческом стеке HTTP, который я использую, свяжитесь со мной (msimpson -at- abelsolutions -dot-com) для ссылок и примеров кода.

И я должен сказать это - я до сих пор не знаю наверняка, есть ли проблема с корнем в стеке HTTP на стороне клиента или на стороне сервера, но, тем не менее, это СБОЙ со стороны Microsoft.

0 голосов
/ 13 августа 2012

У меня была та же проблема, и я исправил ее, создав сертификат с помощью makecert. Выполните шаги из этой статьи http://www.codeproject.com/Articles/24027/SSL-with-Self-hosted-WCF-Service и замените CN своим ip / доменом. В моем случае я проверил сервис на локальном компьютере и выполнил следующие команды:

1) makecert -sv SignRoot.pvk -cy полномочия -r signroot.cer -a sha1 -n "CN = Dev Certification Authority" -ss my -sr localmachine

после выполнения первой команды перетащите сертификат из «Личного» каталога в «Доверенный корневой центр сертификации»

2) makecert -iv SignRoot.pvk -ic signroot.cer -cy end -pe -n CN = "localhost" -eku 1.3.6.1.5.5.7.3.1 -ss my -sr localmachine -sky exchange -sp «Криптографический провайдер Microsoft RSA SChannel» -sy 12

Если вы хотите запустить приложение silverlight на другом компьютере, экспортируйте сертификат, созданный на шаге 1, а затем импортируйте его на любой компьютер, на котором вы хотите, чтобы ваше приложение запускалось.

0 голосов
/ 21 июня 2011

На самом деле решение проблемы может быть таким же простым, как здесь: http://forums.silverlight.net/forums/p/196906/458328.aspx

Требуется только поместить сертификат в доверенное корневое хранилище. Но, к сожалению, в моем случае это не сработало, и я все еще борюсь с этой проблемой.

0 голосов
/ 08 декабря 2010

На этой неделе мы (Слипджиг и я) выяснили, что, похоже, существует способ обойти эти проблемы, или, по крайней мере, мы находимся на пути к определению, существует ли надежный, повторяемый способ.Мы до сих пор не уверены в этом, но вот что мы знаем до сих пор:

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

Сначала поместите элемент управления «WebBrowser» в свой Silverlight XAML и заставьте его отправить запрос на ваш HTTPS-сайт.

Это может вызвать диалоговое окно сертификата для пользователя.Большое делоПринять это.Если у вас есть только один сертификат, вы можете отключить опцию в IE, чтобы подавить это сообщение.

private void Command_Click(object sender, RoutedEventArgs e) {
  // This does not pop up the cert dialog if the option to take the first is turned on in IE settings:
  BrowserInstance.Navigate(new Uri("https://www.SiteThatRequiresClientCertificates.com/"));
}

Затем в отдельном обработчике, вызываемом пользователем, создайте экземпляр вашего стека, либо Clientили браузер:

private void CallServer_Click(object sender, RoutedEventArgs e) {
           // Works with BrowserHttp factory also:
            var req = WebRequestCreator.ClientHttp.Create(new Uri("https://www.SiteThatRequiresClientCertificates.com/"));
            req.Method = "GET";
            req.BeginGetResponse(new AsyncCallback(Callback), req);
}

Наконец, обратный вызов:

private void Callback(IAsyncResult result)
{
            var req = result.AsyncState as System.Net.WebRequest;
            var resp = req.EndGetResponse(result);
            var content = string.Empty;
            using (var reader = new StreamReader(resp.GetResponseStream())) {
                content = reader.ReadToEnd();
            }
            System.Windows.Deployment.Current.Dispatcher.BeginInvoke(() =>
            {
                Results.Text = content;
            });
}
...