Fehler bei HTTPS-Verbindung

TheBodo

Erfahrenes Mitglied
Aloha allerseits.

ich bin schon etwas in der Androidprogrammierung unterwegs, stehe jetzt jedoch vor einem Problem, dass mich verzweifeln lässt.

Zuerst kurz die Hintergrunddaten:

Es geht um ein kleines Spiel, das ich für mich und einige Bekannte geschrieben habe, es ist bisher browserbasiert, soll jedoch um eine App erweitert werden. Jeder Benutzer hat einen Account, also Benutzername und Passwort, die zur Anmeldung gebraucht werden. Aus diesem Grund muss die Verbindung verschlüsselt hergestellt werden, denn Sicherheit geht vor, für den Fall das jemand ein Universalpasswort benutzt, auch wenn er dies nicht tun sollte.

Das Problem:

Bisher habe ich, da der Server wirklich nur im privaten Umfeld benutzt wird, auf selbst signierte Zertifikate, bzw. eine eigene CA gesetzt. Beim Import einer eigenen CA wirft Android jedoch eine richtig fiese dauerhafte Warnung, die ich keinem Nutzer zumuten kann, denn sollte eine Malware eine eigene CA installieren, wird die Warnung nicht mehr beachtet.

Daher hab ich mir bei StartCom Ltd. ein kostenloses signiertes Zertifikat besorgt und es installiert. Die Verbindung wird seitdem in allen Browsern korrekt als sicher angzeigt. Das gilt auch für alle Browser auf meinem Androidphone (Chrome, Opera, Firefox). Das Root-CA von StartCom Ltd. ist auch von Werk aus in Android enthalten. Sobald ich dieses daktiviere, werfen auch die Browser Fehlermeldungen.

Soweit so gut. leider ist es mir in meiner App jedoch nicht möglich, eine Verbindung via DefaultHttpClient zu meinem Server aufzubauen. Dabei wird als Warnung eine SSLException: No Peer Certificate angezeigt, die ich zwar verarbeite (Meldung), was mir jedoch keine Verbindung einbringt.

Bisher probiert habe ich:

1. Zertifikate in Android manuell installieren -> Warnung + Fehler
2. Zertifikate in Truststore und in der App laden -> Fehler
3. Allen Servern vertrauen (nur zum Test) -> Fehler

Hier mal mein Code für 3, 2 analog mit Laden des Truststores.

EDIT: try und catch werden verwendet, hab ich nur aus Übersichtlichkeitsgründen weggelassen.

Java:
		    	DefaultHttpClient client = new DefaultHttpClient();

		    	SchemeRegistry registry = new SchemeRegistry();
		    	SSLSocketFactory socketFactory = SSLSocketFactory.getSocketFactory();
		    	socketFactory.setHostnameVerifier((X509HostnameVerifier) SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
		    	registry.register(new Scheme("https", socketFactory, 443));
		    	SingleClientConnManager mgr = new SingleClientConnManager(client.getParams(), registry);
		    	DefaultHttpClient httpclient = new DefaultHttpClient(mgr, client.getParams());

     
		    	HttpsURLConnection.setDefaultHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

		    	final String url = "https://www.familie-englich.de/";
		    	HttpPost httppost = new HttpPost(url);
			    
		        List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
		        
		        nameValuePairs.add(new BasicNameValuePair("request", params[0]));
		        httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
	
		        HttpResponse response = 
		        		httpclient.execute(httppost);

Weiß jemand Rat?
 

Fasibio

Mitglied
hats du schonmal eine Andere https Seite versucht ? geht es da oder geht es generell bei allen https seinten nicht ?
 

TheBodo

Erfahrenes Mitglied
Moin,

Entschuldige bitte den zeitlichen Versatz, aber aufgrund des SSL-Bugs hatte ich erstmal zwischenzeitlich mein Zertifikat zurückgehalten.

Die App hängt sich an einem NullPointer auf, der das Resultat der nicht stattfindenden SSL-Verbindung ist.
Diese wird im LogCat wie folgt ausgegeben:

Code:
04-09 10:20:35.016: W/System.err(17355): javax.net.ssl.SSLPeerUnverifiedException: No peer certificate
04-09 10:20:35.017: W/System.err(17355): 	at com.android.org.conscrypt.SSLSessionImpl.getPeerCertificates(SSLSessionImpl.java:146)
04-09 10:20:35.017: W/System.err(17355): 	at org.apache.http.conn.ssl.AbstractVerifier.verify(AbstractVerifier.java:93)
04-09 10:20:35.017: W/System.err(17355): 	at org.apache.http.conn.ssl.SSLSocketFactory.createSocket(SSLSocketFactory.java:388)
...

Das ist die Meldung wenn ich das Zertifikatemanagement komplett Android überlasse, also Zeile 3 bis 11 rauswerfe und den DefaultHttpClient in Zeile 1 in httpclient umbenenne.
Wenn ich stattdessen den schon geposteten Code benutze, ändert sich nichts.