Jak uzyskać dostęp do połączenia SSL za pośrednictwem systemu Android?
Zacząłem podążać za samouczkiem, który nie był związany z Androidem i dostałem to:
System.setProperty("javax.net.ssl.trustStore", "truststore");
System.setProperty("javax.net.ssl.trustStorePassword", "password");
SSLSocketFactory ssf = (SSLSocketFactory) SSLSocketFactory.getDefault();
try {
Socket s = ssf.createSocket("192.168.2.11", 6543);
PrintWriter out = new PrintWriter(s.getOutputStream());
while (true){
out.println("SSL TEST");
Log.d("DATA", "DATA SENT");
}
} catch (UnknownHostException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
To chyba sprowadza się do kilku pytań:
-
Nie mam stworzonego własnego sklepu zaufania, ale przeglądając samouczki i rzeczy online, nie jestem pewien, jak go utworzyć. Czy istnieje sposób, w jaki mogę utworzyć lub zmodyfikować sklep zaufania, aby mieć w nim potrzebne certyfikaty? (Używam własnoręcznie podpisanego certyfikatu, jeśli to robi jakąś różnicę)
-
Jak Czy Mogę sprawić, że rzeczy z SSL handshake działają płynnie? W tej chwili pojawia się błąd:
javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
Szczerze mówiąc, nie bardzo rozumiem, co to znaczy. Jakie ustawienia lub pliki muszę zmodyfikować na moim urządzeniu z Androidem, aby upewnić się, że to połączenie może się zdarzyć?
2 answers
1) to zależy. Czy masz certyfikat własnoręcznie podpisany po stronie serwera i próbujesz zweryfikować swoją tożsamość na urządzeniu z Androidem? A może po stronie Androida próbujesz zweryfikować swoją tożsamość na serwerze? Jeśli jest to pierwsze, zobacz ten link: http://www.codeproject.com/KB/android/SSLVerification_Android.aspx?display=Mobile
Należy zwrócić szczególną uwagę na to, gdzie tworzy plik KeyStore.
2) powód, dla którego dostajesz ten błąd to dlatego, że nie ufa serwerowi, z którym się łączysz, ponieważ nie utworzyłeś poprawnie truststore lub łączysz się z serwerem, którego certyfikat nie został dodany do truststore. Z czym dokładnie próbujesz się połączyć?
3) Upewnij się, że masz <uses-permission android:name="android.permission.INTERNET" />
w manifeście.xml.
Edytuj Przepraszam, proszę o zapoznanie się ze zmianami, które wprowadziłem do pierwszego akapitu.
Oto część do zainicjowania keystore i truststore
SSLcontext sslContext = SSLContext.getDefault();
KeyStore trustSt = KeyStore.getInstance("BKS");
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
InputStream trustStoreStream = this.getResources().openRawResource(R.raw.truststore);
trustSt.load(trustStoreStream, "<yourpassword>".toCharArray());
trustManagerFactory.init(trustStre);
KeyStore keyStore = KeyStore.getInstance("BKS");
KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
InputStream keyStoreStream = this.getResources().openRawResource(R.raw.keystore);
keyStore.load(keyStoreStream, "<yourpassword>".toCharArray());
keyManagerFactory.init(keyStore, "<yourpassword>".toCharArray());
sslContext.init(keyManagerFactory.getKeyManagers(), trustManagerFactory.getTrustManagers(), null);
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-22 16:48:55
Nie potrzebujesz własnego truststore, chyba że partner używa certyfikatów podpisanych samodzielnie. JRE jest dostarczany z domyślnie używanym truststore, który ufa certyfikatom wydanym przez wszystkie główne urzędy certyfikacji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-23 01:03:24