Android KeyStore System – Guardar un KeyPair?

Actualmente estoy intentando crear una implementación de KeyStore que funcione en mi aplicación de Android. Actualmente estoy construyendo contra una API mínima de 18 para que pueda aprovechar plenamente una KeyStore privada para mi aplicación. Estoy tratando de generar n número de objetos KeyPair , y guardarlos en el KeyStore para su posterior recuperación. He mirado esta pregunta , sin embargo, parece un poco anticuado (2012) y realmente no responde nada todo lo que bien. Honestamente, la mayoría de las preguntas que he encontrado en Stack Overflow parecen ser increíblemente obsoletas, como aquí y aquí .

Así que mi flujo previsto es el siguiente:

  1. Intente recuperar una clave pública del certificado que corresponda con el alias apropiado.
  2. En caso de que esta clave pública sea nula, cree una clave nueva.
  3. Utilizar KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
  4. Genere el par de claves.

Todo hasta este punto es muy sencillo y funciona bien. A continuación es donde se pone peludo.

  1. Guarde el par de claves. Inicialice el KeyStore a través de KeyStore.getInstance("AndroidKeyStore");
  2. Intente generar un X509Certificate través de un X509V3CertificateGenerator . Este certificado es auto-firmado. Para el cert, fijo el algoritmo de la firma como "SHA1WithRSAEncryption" .
  3. Finalmente, llame a keyStore.setKeyEntry

Para este último paso parecen haber dos opciones:

keyStore.setKeyEntry(String alias, byte[] key, Certificate[] chain);

o

keyStore.setKeyEntry(String alias, Key key, char[] password, Certificate[] chain);

Empecé con el segundo de los dos, pero recibió java.security.KeyStoreException: entries cannot be protected with passwords …. Bueno, eso es extraño, ¿por qué habría un método que garantiza lanzar una excepción? Intentemos la puerta número 1.

En ese momento, cuando llamo a setKeyEntry, y paso keyPair.getPrivate (). GetEncoded () como el segundo argumento, recibo java.security.KeyStoreException: Operation not supported because key encoding is unknown desde el sistema.

Así que estoy un poco perdido. Cifrado como este es relativamente nuevo para mí, por lo que esperaba que alguien podría arrojar algo de luz sobre la situación muy confuso que es el sistema Android KeyStore.

Así que he encontrado la respuesta – esperemos que esto ayudará a salvar algunos problemas para los futuros usuarios, ya que no está claramente establecido en los documentos.

El KeyPairGeneratorSpec.Builder tiene un método setAlias . Cuando se genera una clave, se almacena automáticamente en KeyStore bajo este alias. No hay ahorro adicional que necesita suceder para que funcione. A continuación, puede recuperar fácilmente estas claves a través de la instancia del KeyStore con el mismo String provider que el KeyPairGenerator.

Estaba tratando de importar un archivo PKCS12 (decir descargado por el usuario manualmente) en AndroidKeyStore. Parece que

 keyStore.setKeyEntry(String alias, byte[] key, Certificate[] chain); 

No está implementado por AndroidKeyStore y siempre arroja la siguiente excepción:

 KeyStoreException("Operation not supported because key encoding is unknown") 

Ref: https://android.googlesource.com/platform/frameworks/base.git/+/android-5.1.1_r19/keystore/java/android/security/AndroidKeyStore.java

 @Override public void engineSetKeyEntry(String alias, byte[] userKey, Certificate[] chain) throws KeyStoreException { throw new KeyStoreException("Operation not supported because key encoding is unknown"); } 

Así que intenté usar

 keyStore.setKeyEntry(String alias, Key key, char[] password, Certificate[] chain); 

Pasando contraseña como null. Funcionó bien para mí.

  • ¿Cómo crear una llave RSA keystore Android con una validez infinita?
  • Intellij IDEA - ver contraseña guardada
  • ¿Cómo puedo especificar la ubicación de debug keystore para Android ant debug builds?
  • Telegram API release.keystore ERROR
  • El exponente privado de Android KeyStore no se puede extraer
  • Cómo entregar el código de la aplicación de Android a otro desarrollador: administración de la gestión de claves
  • Es posible liberar una aplicación actualizada mediante la firma con un certificado diferente de la que se utilizó originalmente
  • No se puede encontrar la entrada de Keystore. Pero sé que está ahí
  • Hash de clave de facebook, confusión de keystore android
  • "ERROR: No se puede recuperar la clave" al exportar la aplicación de Android firmada con Keystore existente
  • PKCS # 12 Creación de Keystore en el dispositivo Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.