Android Https-Verbindung

undertaker

Mitglied
Hallo nochmal,

ich dachte ich mache nochmal einen neuen Thread auf. Es geht um eine Https-Verbindung die ich zu einem Server aufbauen will (auf meinem Android Tablet). Außerdem benutze ich ein eigenes Zertifikat mit eigenem Keystore.

Ich erhalte folgende Exception:
Java:
javax.net.ssl.SSLException: Connection closed by peer

Java:
HttpsURLConnection httpsUrlConnection = 
		(HttpsURLConnection) new URL(URLSTRING).openConnection();
httpsUrlConnection.setRequestMethod("POST");
httpsUrlConnection.connect(); // Hier fliegt die Exception

Könnte es damit zu tun haben, dass das Zertifikat nicht verwendet wird oder etwas in der hinsicht?
Wenn ich eine andere URL benutze bekomme ich:
Java:
 javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
Deshalb gehe ich mal davon aus, das mit dem Zertifikat und Keystore usw. alles funktioniert hat?
Wenn mehr Code benötigt wird einfach kurz schreiben.
 
Die Fehlermeldung schaut danach aus als hätte es nicht mit dem Zertifikat funktioniert. Denn die Exception sagt schon alles, es wird dem Zertifikat einfach nicht vertraut. Ist das Zertifikat selbst erstellt?

Du musst dann entweder selbst eine Klasse erstellen die deinem Zertifikat vertraut oder du fügst es zu Androids trusted certificates hinzu.
 
Ich habe das Zertifikat von einem dritten aus der Firma, welches eben benötigt wird um auf den Server zu kommen.

Ich dachte eigentlich, dass ich mit dieser Klasse dem Zertifikat vertraue:

Java:
public class TrustManagerFactory 
{
	private static X509TrustManager serverTrustManager;
	private static KeyStore keystore;
	private static final String keystorePasswort = "...";
	
	private static class MyX509TrustManager implements X509TrustManager 
	{
		private MyX509TrustManager() {}
		
		public static X509TrustManager getInstance()
		{
			return new MyX509TrustManager();
		}
		
		public void checkClientTrusted(X509Certificate[] chain, String authType) 
				throws CertificateException	{}
	
		public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException 
		{
			try 
			{
				serverTrustManager.checkServerTrusted(chain, authType);
				chain[0].checkValidity();
			}
			catch (CertificateException e) 
			{
				throw new CertificateException(e.toString());
			}
		}
	
		public X509Certificate[] getAcceptedIssuers() 
		{
			return new X509Certificate[] {};
		}
	}
	
	public static void ladeKeyStore(InputStream is) throws CertificateException 
	{
		try
		{
			Log.d(BackendTestActivity.TAG, "In ladeKeyStore");
			
			keystore = KeyStore.getInstance("BKS");
			Log.d(BackendTestActivity.TAG, "KeyStore instanz geholt");
			keystore.load(is, keystorePasswort.toCharArray());
			Log.d(BackendTestActivity.TAG, "KeyStore geladen");
			javax.net.ssl.TrustManagerFactory tmf = javax.net.ssl.TrustManagerFactory.getInstance("X509"); 
			tmf.init(keystore);
			TrustManager[] tms = tmf.getTrustManagers();
			
			if (tms != null)
			{
				for (TrustManager tm : tms)
				{
					if (tm instanceof X509TrustManager) 
					{
						serverTrustManager = (X509TrustManager) tm;
						Log.d(BackendTestActivity.TAG, "tm ist instanz von X509TrustManager");
						break;
					}
				}
			}
		}
		catch (Exception e) 
		{
			keystore = null;
			Log.d(BackendTestActivity.TAG, "Exception in ladeKeyStore");
			throw new CertificateException(e);
		}
	}
	
	public static X509TrustManager get()
	{
		return MyX509TrustManager.getInstance();
	}
		
	public static KeyStore getKeyStore() 
	{
		return keystore;
	}
}

Wäre echt nett wenn du mal drüber schauen könntest.
Und wie im anderen Thread schon gesagt habe ich mich an diese Lösung gehalten: pdf

Edit: Im PDF steht auch folgendes:
Wenn wir einen X509TrustManager selbst implementieren, müssen
wir dabei seine Methode checkServerTrusted überschreiben. Denn hier
findet die Prüfung des Servers beim SSL-Handshake statt.

Und die Methode checkServerTrusted beschwert sich ja in keiner weise das etwas nicht stimmt. Also wirklich ein Zertifikat-Problem?
 
Zuletzt bearbeitet:

Zurück
Oben