2012-06-20 17 views
29

Deseo hacer una solicitud https.Versión incorrecta del almacén de claves en la llamada de Android

utilizo BouncyCastle para generar el almacén de claves de la siguiente manera:

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 

Y el comando keylist devolver un valor correcto.

pero cuando lo hago:

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

tengo un error:

wrong version of keystore 

He intentado utilizar varias versiones de bouncycast, pero el resultado es el mismo. También traté de definir KeySize 1024, pero nada cambia.

¿Alguna idea?

+0

No olvides usar SHA-256, porque SHA-1 ya no se usa con android 23+, y es por defecto ... – Cukic0d

Respuesta

30

tener una mirada en ella Android: Trusting SSL certificates

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

y utilizar esta versión al crear el almacén de claves: Versión 1,46found here

Puede que ayude ...

+1

Eso es exactamente lo que hice (y ejecuto nuevamente el tutorial) pero el resultado sigue siendo el mismo. – JuSchz

+1

@julesanchez: TIENE QUE usar bcprov-jdk16-146.jar. La última v147 causará dichos problemas –

+1

¡Puedo confirmar que funciona! –

4

Finalmente he usado un gráfico editor (KeyStore Explorer) en Windows y está funcionando.

Tal vez el error fue causado por problemas de la versión Java/Mac

2

solución está aquí, capaz de eliminar la versión prolem

Creación de archivo de BKS para el cliente androide

detalles de la instalación de software necesarios para crear BKS archivo:

Descargar software de almacén de claves desde el Explorador de enlace http://keystore-explorer.sourceforge.net/

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

Extracto zip y copiar US_export_policy y local_policy a la carpeta C: archivo/programes/java/jre7/lib/security.

instalar el software Keystore Explorer.

pasos para generar el archivo BKS: (Necesita archivo CA, Certificado archivo, archivo de clave y el archivo .P12 i.e.PKCS (si está disponible)

1.) La creación de archivo de confianza utilizando .crt CA utilizando el software de almacén de claves.

Pasos:

software abierto
Ir Archivo-> Nuevo-> seleccione .bks desde el asistente Para importar archivo de certificado CA Ir Herramientas-> Importar certificado de confianza -> seleccione .crt CA -> ENTERT contraseña -> (Lanzará una excepción si el certificado es un auto-signo) importa el archivo con fuerza.

4. Guarde el archivo con extensión .bks.

2) Creación de archivo mediante .p12 el uso de software de almacén de claves

Pasos

software abierto Ir Archivo-> Nuevo-> seleccione .bks desde el asistente

Importar> archivo de p12 Go Herramienta -> Importar par de claves -> seleccionar PKCS # 12 desde el asistente -> ingresar la contraseña de descripción para el archivo de archivos y cejas -> Ingresar alise nombre (si quiere cambiar else puede mantener como está) -> Ingresar nueva contraseña

Guarde el archivo con .bks exte nsion.

3) Creación de archivo mediante .P12 si no está disponible el archivo usando el software de almacén de claves

Pasos

software abierto

Ir Archivo-> Nuevo-> seleccione .bks del asistente de importación > archivo p12 Ir a la herramienta -> Importar par de claves -> seleccionar OpenSSL desde el asistente -> contraseña de descripción sin marcar para el archivo, las cejas .key y .crt (archivo de certificado no CA) archivo -> Ingresar alise nombre (si desea cambiar más puede mantener tal como está) -> Ingrese la nueva contraseña

Guarda el archivo con la extensión .bks.

Copie ambos archivos en la carpeta res/raw (Ambos archivos BKS son obligatorios).

Código:

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

Ejemplo de una publicación que debería haberse formateado ..... – Cukic0d

24

No hay necesidad de hacer cada cosa otra vez !!!

Debe cambiar el tipo de almacén de claves, de BKS a BKS-v1 (BKS-v1 es una versión anterior de BKS). Debido a que la versión BKS cambió como dijo here

Hay otra solución, que es mucho más fácil:

  1. Usando Portecle:

    • Descargas Portecle http://portecle.sourceforge.net/
    • Abre los bks archivo con la contraseña y portecle
    • Do Tools >> Change Tipo de almacén de claves >>BKS-v1
    • Guardar el archivo
  2. Usted puede utilizar el Explorador de KeyStore

El nuevo archivo se codifica con BKS-v1 y no se mostrará ya el error ...

Nota: Android funciona con differentes versión BKS: por ejemplo, API 15 requerirá BKS-1 contraria a la API 23, que requiere BKS, por lo que puede que tenga que poner los dos archivos en su aplicación.

Nota 2: Puede utilizar este código:

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

parecía solucionar un problema que estaba teniendo para un dispositivo 4.0.4, pero dispositivos con 4.1 .1/2 siguen teniendo el mismo problema – Fonix

+1

No sé por qué, pero cuando traté de cambiarlo con Portecle, simplemente me siguió impidiendo cambiar el almacén de claves porque dice "inhabilitación irrecuperable". Pero luego lo probé con Windows y Keystore Explorer y cambié el tipo de almacén de claves a partir de ahí y funcionó como un amuleto. +1 – Simon

+1

Solución para 4.1.1/2: '' 'if (Build.VERSION.SDK_INT> = Build.VERSION_CODES.JELLY_BEAN_MR1) {...}' '' – L3K0V

0

les dejo esta respuesta para proporcionar un cmdline-versión para convertir un archivo a .pkcs12-keystore.bks

Lo se necesita:

Si usted no sabe cómo generar comprobar un .PKCS12-File estos sitios:

para esta muestra utilizo jetty.pkcs12 como fuente. El comando genera: keystore.bks /usr/local/share/java/portecle-1.9/ es la ruta en la que he instalado el descargado Portecle-Herramienta (.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 

Ahora puede utilizar el BKS-Keystore en Android

Gracias a la publicación anterior pude encontrar una solución y proporcionar este cmd. Espero que ayude a alguien!

Cuestiones relacionadas