2011-06-22 11 views
11

zacząłem następujące tutorial, który nie został powlekanego wokół Androida i dostał to:Jak uzyskać dostęp do połączenia SSL przez Androida?

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(); 
    } 

Chyba ten sprowadza się do kilku pytań:

  1. nie mam zaufania mój własny sklep utworzone, ale przeszukując samouczki i rzeczy online, nie jestem pewien jak je utworzyć. Czy istnieje sposób, w jaki mogę utworzyć lub zmodyfikować magazyn zaufanych certyfikatów, aby mieć potrzebne certyfikaty? (Używam certyfikatu z podpisem własnym, jeśli to robi jakąkolwiek różnicę)

  2. W jaki sposób mogę sprawić, aby obsługa handshake SSL przebiegała sprawnie? Obecnie otrzymuję 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 oznacza.

  3. Jakie ustawienia lub pliki należy zmodyfikować na moim urządzeniu z Androidem, aby upewnić się, że to połączenie może się zdarzyć?

+0

Najprawdopodobniej powinieneś zacząć od tego na Androidzie, zamiast próbować modyfikować technikę inną niż Android. –

+0

Próbowałem również umieścić plik magazynu kluczy, który mam z mojego serwera i umieścić go w moim folderze jdk/jre/lib/security, a następnie zmieniając lokalizację i hasło sklepu zaufania, aby pasowały do ​​tego i otrzymałem ten sam wyjątek. – Matt

+0

CZEKAJ! jaki jest "sposób na zrobienie tego na Androidzie"? – Matt

Odpowiedz

10

1) To zależy. Czy posiadasz samopodpisany certyfikat po stronie serwera i próbujesz potwierdzić swoją tożsamość na urządzeniu z Androidem? A może po stronie Androida próbujesz zweryfikować swoją wiarygodność na serwerze? Jeśli jest to pierwsze, zobacz ten link: http://www.codeproject.com/KB/android/SSLVerification_Android.aspx?display=Mobile

Chcesz zwrócić szczególną uwagę na to, gdzie tworzy plik kluczy.

2) Przyczyną tego błędu jest to, że nie ufasz serwerowi, z którym się łączysz, ponieważ nie utworzyłeś poprawnie magazynu zaufanych certyfikatów lub nie łączysz się z serwerem, którego certyfikat nie został dodany do truststore. Z czym dokładnie się łączysz?

3) Upewnij się, że w pliku manifest.xml znajduje się <uses-permission android:name="android.permission.INTERNET" />.

Edytuj Moje przeprosiny, zobacz zmiany wprowadzone w pierwszym akapicie.

Oto część zainicjować swoją kluczy i zaufanych

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); 
+0

[+1] 1) Zbadam to, chociaż (przed obejrzeniem tej strony) nie jestem pewien, czy rozumiem rozróżnienie między magazynem kluczy a magazynem zaufanych certyfikatów. 2) Prawdopodobnie nie utworzyłem poprawnie magazynu zaufanych ...Użyłem funkcji keytool w JRE 3) Wygląda na to, że przynajmniej mam tę część poprawnie: 0) – Matt

+1

Witam, przepraszam, popełniłem błąd w pierwszym akapicie, proszę zobaczyć zmiany. – Otra

+2

Sposób, w jaki myślę o różnicy między magazynem zaufania a magazynem kluczy, to magazyn zaufanych certyfikatów jest listą certyfikatów, którym ufam, więc jeśli jestem po stronie Androida, chcę mieć certyfikat serwera w moim zaufanym magazynie. Magazyn kluczy to miejsce, w którym przechowuję moje poświadczenia w celu sprawdzenia poprawności na serwerze. W witrynie serveride magazyn zaufanych certyfikatów jest miejscem, w którym przechowuję listę zaufanych klientów, a magazyn kluczy jest miejscem, w którym przechowuję własne poświadczenia. – Otra

1

Nie musisz własnego magazynu zaufanych certyfikatów, chyba że uczestnik korzysta samopodpisanym certifictes. Środowisko JRE jest dostarczane z magazynem zaufanych certyfikatów, który jest używany domyślnie, który ufa certyfikatom wydanym przez wszystkie główne urzędy certyfikacji.

+2

, ale używam certyfikatów z podpisem własnym ... – Matt

+0

@Matt, więc musisz utworzyć magazyn zaufanych certyfikatów. Skopiuj ten z JDK; wyeksportuj certyfikat serwera do pliku; i zaimportować go do nowego magazynu zaufanych certyfikatów. – EJP

Powiązane problemy