«Не удалось установить безопасный канал для SSL / TLS» в приложении .NET CF на смартфоне - PullRequest
3 голосов
/ 30 июля 2009

У меня возникла проблема связи с приложением, работающим на платформе .NET Compact Framework 3.5 на смартфонах Windows Mobile.

Я создаю веб-запрос, используя этот код:
<br> UTF8Encoding encoding = new System.Text.UTF8Encoding();<br> byte[] Data = encoding.GetBytes(HttpUtility.ConstructQueryString(parameters));<br> httpRequest = WebRequest.Create((domain)) as HttpWebRequest;<br> httpRequest.Timeout = 10000000;<br> httpRequest.ReadWriteTimeout = 10000000;<br> httpRequest.Credentials = CredentialCache.DefaultCredentials;<br> httpRequest.Method = "POST";<br> httpRequest.ContentType = "application/x-www-form-urlencoded";<br> httpRequest.ContentLength = Data.Length;<br> Stream SendReq = httpRequest.GetRequestStream();<br> SendReq.Write(Data, 0, Data.Length);<br> SendReq.Close();<br> HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse();<br> return httpResponse.GetResponseStream();

Веб-служба функционирует, получая документ в кодировке JSON как часть URL (например, https://site.com/ws/sync??document={"version":"1.0.0","items":[{"item_1":"item1"}]}&user=usr&password=pw), и в качестве ответа получает другой документ JSON в качестве данных ответа.

Этот код прекрасно работает на всех эмуляторах и КПК, работающих под управлением WM 5 и 6. Мы видели проблему с парой клиентов, использующих смартфоны Treo (и только в сети Sprint). Мы проверили код на идентичном устройстве в сети AT & T (через DeviceAnywhere), и код снова заработал, как мы и ожидали.

Это должна быть какая-то политика безопасности на телефоне, но мы не смогли определить обходной путь или тщательно его диагностировать, так как мы не можем воспроизвести его дома и вынуждены были прибегать к помощи пользователей при проведении теста. драйвера для нас.

Когда этот код выполняется, устройство пользователя выдает следующее исключение:

System.Net.WebException
Не удалось установить безопасный канал для SSL / TLS
Трассировка стека: в System.Net.HttpWebRequest.finishGetRequestStream ()
в System.Net.HttpWebRequest.GetRequestStream ()
at OurApp.GetResponseStream (строковый домен, параметры Hashtable)

внутреннее исключение:
System.IO.IOException
Ошибка аутентификации, поскольку удаленная сторона закрыла транспортный поток.
Трассировка стека: в System.Net.SslConnectionState.ClientSideHandshake ()
в System.Net.SslConnectionState.PerformClientHandShake ()
в System.Net.Connection.connect (объект игнорируется)
в System.Threading.ThreadPool.WorkItem.doWork (объект o)
в System.Threading.Timer.ring ()

Проверка сервера Журналы Apache не показывают совпадений с IP-адресом пользователя - я не думаю, что устройство даже пытается отправить пакет до сбоя. Если это уместно, сервер работает под управлением Apache в Linux и написан с использованием платформы Python TurboGears.

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

Приложение устанавливается и запускается без проблем на всех телефонах - оно просто устанавливает это SSL-соединение, которое разрывается для этих пользователей.

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

Последнее замечание: мы попробовали синхронизировать как через ActiveSync, так и через GPRS с одинаковыми результатами.

Любые мысли будут с благодарностью!

1 Ответ

0 голосов
/ 25 июня 2013

У меня была такая же проблема с сервером Tomcat.

Он исчез после использования SSLProtocol = "all" в моем коннекторе Tomcat (server.xml).

Я был введен в заблуждение по инструкции Tomcat SSL, которая использует SSLProtocol = "TLSv1". Это значение подходит для IE на мобильном устройстве, но не для моего приложения .Net Compact Framework 3.5.

...