2012-06-20 12 views
29

Ich möchte eine HTTPS-Anfrage stellen.Falsche Version von Keystore auf Android-Anruf

Ich benutze bouncycastle den Schlüsselspeicher wie folgt zu generieren:

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 

Und der keylist Befehl einen korrekten Wert zurück.

Aber wenn ich das tue:

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

ich einen Fehler haben:

wrong version of keystore 

Ich habe versucht, mehrere Version von bouncycast zu verwenden, aber das Ergebnis ist das gleiche. Ich habe auch versucht, Keysize 1024 zu definieren, aber nichts ändert sich.

Irgendwelche Ideen?

+0

Vergessen Sie nicht, SHA-256 zu verwenden, denn SHA-1 wird nicht mehr mit Android 23+ verwendet, und ist standardmäßig ... – Cukic0d

Antwort

30

Werfen Sie einen Blick auf sie Android: Trusting SSL certificates

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

Und diese Version verwenden, wenn Ihr Schlüsselspeicher zu schaffen: Version 1,46found here

es hilft Mai ...

+1

Das ist genau das, was ich getan habe (und ich führe das Tutorial erneut aus) das Ergebnis ist immer noch dasselbe. – JuSchz

+1

@julesanchez: Sie müssen bcprov-jdk16-146.jar verwenden. Neueste v147 wird die genannten Probleme verursachen –

+1

Ich kann bestätigen, dass es funktioniert! –

4

Schließlich habe ich eine Grafik Editor (KeyStore Explorer) unter Windows und es funktioniert.

Vielleicht ist der Fehler von Java/Mac-Version Probleme

2

Lösung verursacht wurde, ist hier der Lage, die Version prolem

Erstellen von BKS-Datei für Android-Client

Software-Installation erforderlichen Angaben zu entfernen BKS erstellen Datei:

herunterladen Schlüsselspeicher Explorer-Software von Link http://keystore-explorer.sourceforge.net/

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

Extract zip und kopieren US_export_policy und local_policy zu Ihrem C:/programes Datei/java/jre7/lib/security Ordner.

Keystore Explorer-Software installieren.

Schritte zum Generieren BKS-Datei: (CA-Datei benötigen, Zertifikatsdatei, Schlüsseldatei und P12 i.e.PKCS Datei (falls vorhanden)

. 1) Erstellen von Trust-Datei mit Schlüsselspeicher-Software CA .crt-Datei.

Schritte:

Offene Software
Go File-> New-> wählen .bks aus dem Assistenten Um CA Zertifikatsdatei Go Tool- zu importieren> Importieren vertrauenswürdiges Zertifikat -> wählen CA CRT-Datei -> entert password -> (Es wird eine Ausnahme ausgelöst, wenn das Zertifikat selbstsigniert ist).

4.Speichern Sie die Datei mit der Erweiterung .bks.

2) Erstellen von Schlüsseldatei P12-Datei mit Schlüsselspeicher Software

Schritte

Offene Software Go File- mit> Neu> wählen .bks aus dem Assistenten

Import> p12-Datei Go Werkzeug -> Schlüsselpaar importieren -> PKCS # 12 aus dem Wizard wählen -> Passwort für Datei- und Brückendatei eingeben -> Namen eingeben (falls anders geändert werden soll) -> Neues Passwort eingeben

Speichern Sie die Datei mit .bks exte nsion.

3) Erstellen von Key-Datei zu verwenden, wenn P12

Schritte

Offene Software

Go File-> New-> select .bks aus dem Import-Assistenten mit Schlüsselspeicher-Software nicht verfügbar Datei > p12 Datei Go Tool -> Schlüsselpaar importieren -> OpenSSL aus dem Assistenten wählen -> ungekennzeichnetes Passwort für die Datei, brows .key und .crt (Zertifikatsdatei nicht CA) Datei -> Geben Sie den Namen des Alise ein (falls Sie den Namen ändern möchten, können Sie ihn behalten) so wie es ist) -> Neues Passwort eingeben

Datei mit der Erweiterung .bks speichern.

Beide Dateien im Ordner res/rohe kopieren (beide BKS-Dateien sind obligatorisch).

Code:

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

Beispiel für einen Beitrag, der hätte formatiert werden sollen ... – Cukic0d

24

Keine Notwendigkeit, wieder alles, was zu tun !!!

Sie müssen den Typ des Schlüsselspeichers ändern, von BKS zu BKS-v1 (BKS-v1 ist eine ältere Version von BKS). Da die BKS-Version als geändert, sagte here

Es gibt eine andere Lösung ist, das ist viel viel einfacher:

  1. Mit Portecle:

    • Downloads Portecle http://portecle.sourceforge.net/
    • Öffnen Sie Ihre bks Datei mit dem Passwort und portec
    • Do Tools >> ändern Schlüsselspeicher Typ >>BKS-v1
    • Speichern Sie die Datei
  2. Sie Keystore Explorer verwenden

Die neue Datei wird mit BKS-v1 codiert werden und wird nicht angezeigt mehr der Fehler ....

Hinweis: Android arbeitet mit differents BKS Version: zum Beispiel API 15 erfordert BKS-1 im Gegensatz zu API 23, die BKS benötigen, so können Sie beiden Dateien in Ihrer Anwendung setzen müssen.

Anmerkung 2: Sie diesen Code verwenden können:

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

schien ein Problem zu beheben, das ich für ein Gerät 4.0.4 hatte, aber Geräte mit 4.1 .1/2 haben immer noch das gleiche Problem – Fonix

+1

Ich weiß nicht warum, aber als ich versuchte, es mit Portecle zu ändern, verbot es mir immer wieder, den Schlüsselspeicher zu ändern, weil es eine nicht behebbare Schlüsselausnahme anzeigt. Aber dann habe ich es mit Windows und Keystore Explorer ausprobiert und den Keystore-Typ von dort geändert und es funktionierte wie ein Zauber. +1 – Simon

+1

Abhilfe für 4.1.1/2: '' 'if (Build.VERSION.SDK_INT> = Build.VERSION_CODES.JELLY_BEAN_MR1) {...}' '' – L3K0V

0

Ich poste diese Antwort eine .pkcs12-Datei eine cmdline-Version zur Verfügung zu stellen für die Umwandlung von

keystore.bks Was gebraucht wird:

Wenn Sie nicht wissen, wie diese Seiten eine .PKCS12-Datei überprüfen generieren:

Ich benutze jetty.pkcs12 als Quelle für diese Probe. Der Befehl generiert: keystore.bks /usr/local/share/java/portecle-1.9/ der Pfad ist, wo ich die heruntergeladene 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 

Jetzt können Sie installiert haben verwenden der BKS-Keystore unter Android

Dank der vorherigen Buchung konnte ich eine Lösung finden und diese cmd bereitstellen. Hoffe es hilft jemandem!

Verwandte Themen