2012-06-20 9 views
29

Chcę utworzyć żądanie https.Zła wersja magazynu kluczy na telefonie z systemem Android

używam BouncyCastle do generowania kluczy takiego:

keytool -importcert -trustcacerts -alias ludevCA -file lu_dev_cert.crt -keypass mypass -keystore keystore.bks -storepass mypass -storetype BKS -providerclass org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath bcprov-jdk15on-146.jar 

a polecenie keylist zwróci poprawną wartość.

Ale kiedy zrobić:

KeyStore ks = KeyStore.getInstance("BKS"); 
InputStream in = getResources().openRawResource(R.raw.keystore); 
ks.load(in, "mypass".toCharArray()); 

mam błąd:

wrong version of keystore 

próbowałem korzystać z kilku wersji bouncycast, ale wynik jest taki sam. Próbowałem również zdefiniować keyize 1024, ale nic się nie zmieniło.

Wszelkie pomysły?

+0

Nie zapomnij użyć SHA-256, bo SHA-1 nie jest już używany z Androidem 23+ i jest domyślnie ... – Cukic0d

Odpowiedz

30

rzucić okiem na niego Android: Trusting SSL certificates

-storetype BKS 
    -provider org.bouncycastle.jce.provider.BouncyCastleProvider 
    -providerpath /path/to/bouncycastle.jar 

i używać tej wersji podczas tworzenia kluczy: Wersja 1,46found here

Może to pomaga ...

+1

To jest dokładnie to, co zrobiłem (i ponownie wykonuję samouczek), ale wynik jest wciąż taki sam. – JuSchz

+1

@julesanchez: MUSISZ użyć bcprov-jdk16-146.jar. Najnowsze v147 spowoduje te problemy –

+1

Potwierdzam, że to działa! –

4

końcu użyłem grafikę edytor (KeyStore Explorer) pod Windows i działa.

Może błąd został spowodowany przez Java/Mac problemów Wersja

2

rozwiązaniem jest tu w stanie usunąć wersji prolem

tworzenia pliku BKS android klienta

szczegóły instalacji oprogramowania wymagane do utworzenia BKS plik:

Pobierz oprogramowanie kluczy Explorer z linkiem http://keystore-explorer.sourceforge.net/

Pobierz UnlimitedJCEPolicyJDK7 z http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html

Rozpakuj plik ZIP i skopiuj US_export_policy i local_policy do folderu C:/programes file/java/jre7/lib/security.

zainstalować oprogramowanie Keystore Explorer.

kroki, aby wygenerować plik BKS: (Need plik, plik certyfikatu CA, klucz plików i .p12 plik i.e.PKCS (jeśli są dostępne)

1). Tworzenie pliku za pomocą zaufania CA plik .crt pomocą oprogramowania kluczy.

Kroki:

oprogramowanie Open
Go File-> New-> wybierz .bks z kreatora Aby zaimportować plik certyfikatu CA Go od narzędzi> Importuj zaufany certyfikat -> wybierz plik .crt CA -> Entert hasło -> (spowoduje to, że będzie to wyjątek, jeśli certyfikat jest samopodpisem), plik importu będzie wymuszony.

4.Zapisz plik z rozszerzeniem .bks.

2) Tworzenie pliku klucza, używając .p12 plik za pomocą oprogramowania kluczy

Kroki

oprogramowanie Open Go File-> New-> wybierz .bks z kreatora

Importuj> plik p12 Go Narzędzie -> Importuj parę kluczy -> wybierz PKCS # 12 z kreatora -> wprowadź hasło do odszyfrowywania plików i plików przeglądanych na brwiach -> Wprowadź nazwę aliasu (jeśli chcesz zmienić, aby inne pozostały bez zmian) -> Wprowadź nowe hasło

Zapisz plik za pomocą .bks exte nsion.

3) Tworzenie pliku za pomocą klucza jeśli .p12 nie jest dostępny plik za pomocą oprogramowania kluczy

Steps

oprogramowanie Open

Go File-> New-> wybierz .bks z kreatora importu > p12 plik Go Tool -> Importuj parę kluczy -> wybierz OpenSSL z kreatora -> niezaznaczone hasło do deszyfrowania pliku, przegląda plik .key i .crt (Plik certyfikatu nie jest CA) -> Wprowadź nazwę aliasu (jeśli chcesz zmienić coś innego, możesz zachować tak jak jest) -> Wprowadź nowe hasło

Zapisz plik z rozszerzeniem .bks.

Skopiuj oba pliki w folderze res/raw (oba pliki BKS są obowiązkowe).

Kod:

static final String ENABLED_CIPHERS[] = { 
    "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", 
    "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", 
    "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", 
    "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", 
    "TLS_DHE_RSA_WITH_AES_128_CBC_SHA", 
    "TLS_DHE_RSA_WITH_AES_256_CBC_SHA", 
    "TLS_DHE_DSS_WITH_AES_128_CBC_SHA", 
    "TLS_ECDHE_RSA_WITH_RC4_128_SHA", 
    "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA", 
    "TLS_RSA_WITH_AES_256_CBC_SHA", 
    "TLS_RSA_WITH_AES_128_CBC_SHA", 
    "SSL_RSA_WITH_3DES_EDE_CBC_SHA", 
    "SSL_RSA_WITH_RC4_128_SHA", 
    "SSL_RSA_WITH_RC4_128_MD5", 
}; 
// put this in a place where it can be reused 
static final String ENABLED_PROTOCOLS[] = { 
     "TLSv1.2", "TLSv1.1", "TLSv1" 
    }; 

    private void sslCon() 
    { 
     try { 
          // setup truststore to provide trust for the server certificate 
       // load truststore certificate 
      InputStream trustStoresIs = getResources().openRawResource(R.raw.client_ca); 
      String trustStoreType = KeyStore.getDefaultType(); 
      KeyStore trustStore = KeyStore.getInstance(trustStoreType); 
      trustStore.load(trustStoresIs, "spsoft_123".toCharArray()); 
      //keyStore.setCertificateEntry("ca", ca); 

      // initialize trust manager factory with the read truststore 
      String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm(); 
      TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm); 
      tmf.init(trustStore); 

      // setup client certificate 
      // load client certificate 
      InputStream keyStoreStream = getResources().openRawResource(R.raw.client_cert_key); 
      KeyStore keyStore = null; 
      keyStore = KeyStore.getInstance("BKS"); 
      keyStore.load(keyStoreStream, "your password".toCharArray()); 

      KeyManagerFactory keyManagerFactory = null; 
      keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
      keyManagerFactory.init(keyStore, "your password".toCharArray()); 

      // Create an SSLContext that uses our TrustManager 
      SSLContext context = SSLContext.getInstance("SSL"); 
      context.init(keyManagerFactory.getKeyManagers(), tmf.getTrustManagers(), null); 

      SSLSocketFactory sslsocketfactory = (SSLSocketFactory)context.getSocketFactory(); 
      InetAddress serverAddr = InetAddress.getByName("192.168.11.104"); 
      sslSocket = (SSLSocket) sslsocketfactory.createSocket(serverAddr, 5212); 
      //String[] ciphers = sslSocket.getEnabledCipherSuites(); 
      sslSocket.setEnabledCipherSuites(ENABLED_CIPHERS); 
      // put this right before setEnabledCipherSuites()! 
      //sslSocket.setEnabledProtocols(ENABLED_PROTOCOLS); 
      //InputStream inputStream = sslSocket.getInputStream(); 
      OutputStream out = sslSocket.getOutputStream(); 

      Toast.makeText(getApplicationContext(), "Connected", Toast.LENGTH_SHORT).show(); 
      sslSocket.close(); 


     } catch (KeyManagementException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (CertificateException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (KeyStoreException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (NoSuchAlgorithmException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (UnrecoverableKeyException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

} 
+0

Przykład postu, który powinien zostać sformatowany ..... – Cukic0d

24

Nie trzeba robić wszystko, co ponownie !!!

Należy zmienić typ magazynu kluczy, z BKS na BKS-v1 (BKS-v1 to starsza wersja BKS). Ponieważ wersja BKS zmieniło jak powiedział here

Nie ma innego rozwiązania, które jest o wiele łatwiejsze:

  1. Korzystanie Portecle:

  2. może używać kluczy Explorer

Nowy plik zostanie zakodowany z BKS-v1 i nie pokaże już błąd ...

Uwaga: Android działa z zróżnicowanych BKS wersji: na przykład, API 15 będzie wymagać BKS-1 sprzecznego API 23, który wymaga BKS, więc może trzeba umieścić oba pliki w aplikacji.

Uwaga 2: Można użyć tego kodu:

int bks_version; 
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
    bks_version = R.raw.publickey; //The BKS file 
} else { 
    bks_version = R.raw.publickey_v1; //The BKS (v-1) file 
} 
KeyStore ks = KeyStore.getInstance("BKS"); 
InputStream in = getResources().openRawResource(bks_version); 
ks.load(in, "mypass".toCharArray()); 
+0

wydawało się naprawić problem jaki miałem dla urządzenia 4.0.4, ale urządzenia z 4.1 .1/2 nadal mają ten sam problem – Fonix

+1

Nie wiem dlaczego, ale kiedy próbowałem zmienić to z Portecle, po prostu zabronił mi zmiany magazynu kluczy, ponieważ mówi o nieodwracalnym wyjątku. Ale potem wypróbowałem to z Windows i Keystore Explorer i zmieniłem typ magazynu kluczy i działało jak czar. +1 – Simon

+1

Obejście dla wersji 4.1.1/2: '' 'if (Build.VERSION.SDK_INT> = Build.VERSION_CODES.JELLY_BEAN_MR1) {...}' '' – L3K0V

0

jestem delegowania tę odpowiedź dostarczenie cmdline-wersja do konwersji .pkcs12 akta keystore.bks

Co potrzebne:

Jeśli nie wiem jak wygenerować .PKCS12-File sprawdzić te strony:

dla tej próbki używam jetty.pkcs12 jako źródła. Polecenie generuje: keystore.bks /usr/local/share/java/portecle-1.9/ jest ścieżka gdzie mam zainstalowane pobranego Portecle-Tool (.zip)

keytool -importkeystore -srckeystore jetty.pkcs12 \ 
-srcstoretype PKCS12 -deststoretype BKS -providerpath \ 
/usr/local/share/java/portecle-1.9/bcprov.jar -provider \ 
org.bouncycastle.jce.provider.BouncyCastleProvider-destkeystore \ 
keystore.bks 

Teraz można użyć BKS-Keystore pod Androidem

Dzięki prev posting udało mi się znaleźć rozwiązanie i dostarczyć ten cmd. Mam nadzieję, że to komuś pomaga!

Powiązane problemy