Versión incorrecta de keystore en la llamada android

Quiero hacer una solicitud https.

Utilizo bouncycastle para generar el keystore como esto:

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 devuelve 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 

Intenté usar varias versiones de bouncycast, pero el resultado es el mismo. También intenté definir keysize 1024, pero nada cambia.

Algunas ideas ?

Echa un vistazo a ello Android: confianza en los certificados SSL

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

Y utilice esta versión al crear su almacén de claves: Versión 1.46 encontrada aquí

Que ayude …

No hay necesidad de hacer todo de nuevo!

Necesita cambiar el tipo de keystore, de BKS a BKS-v1 (BKS-v1 es una versión anterior de BKS). Debido a que la versión BKS cambió como se ha dicho aquí

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

  1. Usando Portecle:

    • Descargas Portecle http://portecle.sourceforge.net/
    • Abra su archivo bks con la contraseña y el portecle
    • Herramientas >> Cambiar el tipo de almacén de claves >> BKS-v1
    • Guarda el archivo
  2. Puede utilizar KeyStore Explorer

El nuevo archivo será codificado con BKS-v1 y no mostrará más el error ….

Nota: Android funciona con diferentes versiones de BKS: por ejemplo, la API 15 requerirá BKS-1 en contra de la API 23 que requiere BKS, por lo que es posible que necesite colocar ambos 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()); 

Finalmente utilicé un editor gráfico (KeyStore Explorer) bajo Windows y está funcionando.

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

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

Creación de un archivo BKS para cliente android

Detalles de instalación del software necesarios para crear el archivo BKS:

Descargue el software Keystore Explorer desde el enlace http://keystore-explorer.sourceforge.net/

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

Extraiga zip y copie US_export_policy y local_policy en la carpeta C: / programes file / java / jre7 / lib / security.

Instale el software Keystore Explorer.

Pasos para generar un archivo BKS: (Necesita un archivo CA, un archivo de certificado, un archivo clave y un archivo .P12 iePKCS (si está disponible).

1) Creación de archivo Trust utilizando el archivo .crt de CA utilizando el software de keystore.

Pasos:

Abrir software
Go Archivo-> Nuevo-> seleccione .BKS del asistente Para importar el archivo de certificado de la CA Ir a la herramienta-> Importar certificado de confianza -> seleccionar archivo .crt de CA -> contraseña de entrada -> (Se lanzará una excepción si el certificado es autónomo) Importación archivo con fuerza.

4.Save archivo con extensión .bks.

2) Creación de archivo de clave utilizando el archivo .P12 utilizando software de keystore

Pasos

Abra el software Go File-> New-> seleccione .BKS desde el asistente

Importar> archivo p12 Ir a la herramienta -> Importar par de claves -> seleccionar PKCS # 12 desde el asistente -> ingresar contraseña de descripción para el archivo y las cejas archivo -> Escriba alise nombre (si desea cambiar otro puede mantener como está) contraseña

Guardar archivo con la extensión .bks.

3) Crear el archivo de la llave usando si .P12 no está disponible archivo usando el software del keystore

Pasos

Abrir software

Ir Archivo -> Nuevo-> Seleccionar .BKS del asistente Importar> Archivo p12 Ir Herramienta -> Importar par de claves -> Seleccionar OpenSSL del asistente -> Desmarque la contraseña decripción para el archivo, las cejas .key y .crt Archivo -> Ingrese el nombre del alise (si desea cambiar otro puede mantenerlo como está) -> Escriba la nueva contraseña

Guardar archivo con la extensión .bks.

Copiar el archivo en la carpeta res / raw (Ambos archivos BKS son compulsarry).

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

Estoy publicando esta respuesta para proporcionar una versión cmdline para convertir un archivo .pkcs12 a keystore.bks

Qué se necesita:

Si no sabe cómo generar un archivo .PKCS12, consulte 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 donde he instalado la herramienta Portecle-Tool (.ZIP) descargada

 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 puedes usar el BKS-Keystore en Android

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

  • No se ha generado hash clave
  • Javax.net.ssl.SSLPeerUnverifiedException: Ningún certificado igual mientras intentaba conectarse usando https con .bks keystore
  • Compartir debug.keystore
  • Nombre de la unidad organizativa
  • ¿Cómo puedo crear un almacén de claves?
  • Problema al ejecutar mi keystore firmado y liberado en Eclipse
  • Android Marketplace: ¿Los detalles (nombre, etc) en el almacén de claves son visibles para el usuario?
  • No puede firmar el APK sin firmar
  • ¿Cómo saber el uso del archivo .apk al almacén de claves para firmar?
  • Almacenamiento seguro de una clave simétrica en el uso de Android KeyChain
  • ¿El android apoya el tipo del keystore de .jks?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.