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:
- Utilizar el mismo almacén de claves de depuración en varios equipos
- ¿Dónde está debug.keystore en Android Studio
- Android - obteniendo clave hash para la integración de Facebook
- Extraer certificado crudo X.509 de un firmado APK o JAR
- Consola para programadores de Android: una huella dactilar errónea tras la creación de la versión con Android Studio
- Intente recuperar una clave pública del certificado que corresponda con el alias apropiado.
- En caso de que esta clave pública sea nula, cree una clave nueva.
- Utilizar
KeyPairGenerator.getInstance("RSA", "AndroidKeyStore");
- Genere el par de claves.
Todo hasta este punto es muy sencillo y funciona bien. A continuación es donde se pone peludo.
- Guarde el par de claves. Inicialice el KeyStore a través de
KeyStore.getInstance("AndroidKeyStore");
- Intente generar un
X509Certificate
través de unX509V3CertificateGenerator
. Este certificado es auto-firmado. Para el cert, fijo el algoritmo de la firma como"SHA1WithRSAEncryption"
. - 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.
- Perdió el alias del almacén de claves pero tiene el archivo y la contraseña utilizados para alias
- Almacenamiento de claves en Android
- ¿Dónde esconde Eclipse el almacén de claves?
- Contraseña del almacén de claves alterada
- Error de lectura: error en la biblioteca SSL, generalmente un error de protocolo
- ERROR: No se pudo leer la clave del almacén: ... No se puede recuperar la clave en Android Studio al generar APK firmado
- SSLHandshakeException: Ancla de confianza para la ruta de certificación no encontrada. Solo en la API de Android <19
- Error de "Versión incorrecta de almacén de claves". ¿Cómo puedo crear un certificado de almacén de claves de versión = 1?
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")
@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í.