2009-07-29 6 views
3

Ich habe ein hartnäckiges Kommunikationsproblem mit einer Anwendung, die auf dem .NET Compact Framework 3.5 auf Windows Mobile-Smartphones ausgeführt wird."Konnte keinen sicheren Kanal für SSL/TLS einrichten" in .NET CF-Anwendung auf dem Smartphone

Ich bin der Aufbau eine Web-Anfrage mit diesem Code:

UTF8Encoding encoding = new System.Text.UTF8Encoding();
byte[] Data = encoding.GetBytes(HttpUtility.ConstructQueryString(parameters));
httpRequest = WebRequest.Create((domain)) as HttpWebRequest;
httpRequest.Timeout = 10000000;
httpRequest.ReadWriteTimeout = 10000000;
httpRequest.Credentials = CredentialCache.DefaultCredentials;
httpRequest.Method = "POST";
httpRequest.ContentType = "application/x-www-form-urlencoded";
httpRequest.ContentLength = Data.Length;
Stream SendReq = httpRequest.GetRequestStream();
SendReq.Write(Data, 0, Data.Length);
SendReq.Close();
HttpWebResponse httpResponse = (HttpWebResponse)httpRequest.GetResponse();
return httpResponse.GetResponseStream();

Die Web-Service-Funktionen durch ein JSON-codiertes Dokument als Teil der URL empfängt (zB https://site.com/ws/sync??document= { "Version":. "1.0.0 "," Elemente ": [{" item_1 ":" item1 "}]} & user = usr & password = pw) und als Antwort ein weiteres JSON-Dokument als Antwortdaten empfängt.

Dieser Code läuft auf allen Emulatoren und PDAs, auf denen WM 5 und 6 ausgeführt werden, einwandfrei. Wir haben ein Problem mit einigen Kunden bei Treo-Smartphones (und nur im Sprint-Netzwerk) festgestellt. Wir haben den Code auf einem identischen Gerät im AT & T-Netzwerk (über DeviceAnywhere) getestet und der Code hat wieder wie erwartet funktioniert.

Dies muss eine Art Sicherheitsrichtlinie auf dem Telefon sein, aber wir konnten keine Problemumgehung feststellen oder gründlich diagnostizieren, da wir sie nicht intern reproduzieren können und dazu gezwungen wurden, Benutzer zum Laufen zu bringen Testfahrer für uns.

Wenn dieser Code ausgeführt wird, führt das Gerät des Benutzers die folgende Ausnahme:

System.Net.WebException
nicht feststellen konnte, sicheren Kanal für SSL/TLS
Stack-Trace: bei System.Net.HttpWebRequest.finishGetRequestStream()
bei System.Net.HttpWebRequest.GetRequestStream()
bei OurApp.GetResponseStream (String-Domäne, Hashtable Parameter)

innere Ausnahme:
System.IO.IOException
Authentifizierung fehlgeschlagen, da die Gegenstelle den Transportstream geschlossen hat.
Stapelüberwachung: bei System.Net.SslConnectionState.ClientSideHandshake()
bei System.Net.SslConnectionState.PerformClientHandShake()
bei System.Net.Connection.connect
bei System.Threading.ThreadPool (Object ignoriert). WorkItem.doWork (Object o)
bei System.Threading.Timer.ring()

die Server Apache-Logs Prüfungs zeigt keine Treffer von der IP-Benutzer - ich glaube nicht, das Gerät selbst eine senden versucht Paket bevor es scheitert. Falls erforderlich, führt der Server Apache unter Linux aus und wird mit dem Python-Framework von TurboGears geschrieben.

Das Serverzertifikat wird von einer Zertifizierungsstelle ausgestellt und ist weiterhin gültig. Der Testtreiber, von dem dieser Fehler kopiert wurde, war nicht mit Code signiert. Derselbe Fehler (ohne die Fehlermeldungen) wurde jedoch mit einem GeoTrust-Zertifikat signiert. Daher glauben wir nicht, dass dies ein Code Signing-Problem ist.

Die Anwendung installiert und startet ohne Problem auf allen Telefonen - es ist nur die Einrichtung dieser SSL-Verbindung, die für diese Benutzer bricht.

Ein wichtiges Problem bei der Fehlersuche ist, dass jedes Mal, wenn wir eine Lösung ausprobieren, erhebliche Unannehmlichkeiten entstehen (wir müssen einen "freiwilligen" Kunden finden), also suchen wir wirklich nach einer Silberkugel oder einem besseren Verständnis der Handshaking-Prozess, so dass wir einigermaßen sicher sein können, müssen wir nur den Benutzer bitten, es ein oder zwei Mal zu testen.

Eine letzte Erwähnung: Wir haben die Synchronisierung sowohl über ActiveSync als auch über GPRS mit identischen Ergebnissen versucht.

Alle Gedanken würden sehr geschätzt werden!

Antwort

0

Ich hatte das gleiche Problem mit einem Tomcat-Server.

Es ging nach der Verwendung von SSLProtocol = "alle" in meinem Tomcat Connector (server.xml) weg.

Ich wurde von Tomcat SSL How-To, die SSLProtocol = "TLSv1" verwendet, in die Irre geführt. Dieser Wert war für IE auf dem mobilen Gerät in Ordnung, aber nicht für meine .Net Compact Framework 3.5-Anwendung.

Verwandte Themen