En el mundo moderno, Google Play Es ampliamente utilizado por los desarrolladores para publicar sus aplicaciones con Google Android. Sin embargo, al publicarlo, se deben tener en cuenta algunos matices para una mayor seguridad. Uno de ellos es el certificado autofirmado.
Los certificados autofirmados no suelen usarse en el entorno TLS (excepto para pruebas). Sin embargo, en el diseño de código, aún se usan. Especialmente en Android, donde la clave autofirmada se usa para la "clave de carga". Exploremos cómo generar la "clave de carga" de forma segura, pero antes...
¿Qué es la clave de carga?
La clave de carga es el nuevo método para subir APKs (Android Package Kit) a Google Play App Signing para su publicación. Esta clave establece la confianza entre tu empresa y Google para subir un paquete de Android. El paquete de Android debe firmarse con la clave de carga antes de subirlo a Play Console. Es completamente diferente de la clave de firma de aplicaciones que se usa para firmar el paquete de Android para su distribución.
Por lo tanto, Play App Signing utiliza dos claves: la clave de firma de la aplicación y la clave de carga. En este artículo, solo haremos referencia a la clave de carga.
A continuación se muestra una figura para ilustrar el flujo de firma en Android:

¿Por qué utilizar Upload Key?
Si continúa usando la clave de firma de su aplicación para sus lanzamientos, corre el riesgo de que se filtre debido a un error humano. Sin embargo, supongamos que usa una clave de carga independiente para firmar los binarios que genera en su equipo.
En ese caso, incluso si la clave de carga se ve comprometida, un tercero malintencionado no podrá usarla para crear APKs que suplanten la tuya. Por lo tanto, se recomienda usar una clave de carga independiente.

Utilice siempre la opción “Exportar y cargar una clave desde Java Keystore” desde el punto de vista de seguridad.
Pero ¿cómo creamos una clave de carga?
Los certificados autofirmados se utilizan para generar una clave de carga. Primero, analizaremos el método simple que se suele usar para crear una clave autofirmada mediante OpenSSL y, posteriormente, la falla y la solución de este enfoque:
Una forma sencilla de crear una clave autofirmada a través de OpenSSL
Generación de clave privada
Primero, creamos una clave privada. El siguiente comando crea una clave privada RSA de 4096 bits (.key) con el comando OpenSSL:
openssl genrsa -out carga.clave 4096

Si queremos que la clave privada esté cifrada, añadimos el -des3 Opción al comando.
openssl genrsa -des3 -out carga.clave 4096

Una consecuencia de la clave privada con frase de contraseña es que Apache la requiere cada vez que se inicia el servidor web. Obviamente, esto no siempre es práctico, ya que la persona que introduce los datos no siempre está presente para escribir la frase de contraseña, por ejemplo, después de un reinicio o una caída del sistema.
Creación de una solicitud de firma de certificado
Necesita una Solicitud de Firma de Certificado (CSR) si desea que su certificado esté firmado. La CSR contiene su clave pública e información adicional (organización, país, etc.).
Creemos un CSR (upload.csr) a partir de nuestra clave privada existente:
openssl req -key upload.key -new -out upload.csr


Obtención de certificado de CSR y clave generada
Una vez generados el CSR y la clave privada, el siguiente paso es crear el certificado. El siguiente comando genera el certificado con una validez de 365 días:
openssl x509 -req -days 365 -in upload.csr -signkey upload.key -out upload.crt

El certificado recibido está en formato .crt, sin clave privada, y necesitamos un formato .pfx (ya que contiene una clave privada) para firmar los archivos. Usaremos el siguiente comando para convertirlo a .pfx:
openssl pkcs12 -inkey upload.key -in upload.crt -export -out upload.pfx
Una vez proporcionada la contraseña, se generará el archivo .pfx.

Este archivo pfx se supone que firma el paquete Android.
Suena bien, ¿verdad? Sin embargo, los archivos firmados con este certificado no se aceptan en Play Store. Esto se debe a que el certificado autofirmado no contiene las extensiones de Uso de Clave ni de Uso Mejorado de Clave. Para comprobarlo, abra Certificados en la MMC (Microsoft Management Console) y cargue el complemento Certificados. Tras abrir el certificado, haga clic en la pestaña Detalles.

Pero ¿qué son las extensiones de uso de clave?
Las extensiones de uso de clave (KU) definen la finalidad de la clave pública contenida en un certificado. Una sola clave debe usarse para un solo propósito.
¿Cuántas extensiones de uso de clave están disponibles y cuál debería elegir?
Según RFC 5280 (Uso de claves)Las siguientes extensiones de uso clave están disponibles:
- Firma digital
- No repudio
- Cifrado de claves
- Cifrado de datos
- Acuerdo clave
- Firma de certificado
- Firma de CRL
- Sólo cifrar
- Descifrar solamente
De manera similar, para el uso de clave extendida (EKU), según el caso de uso, se deben elegir los siguientes valores:
| Tecla extendida | Habilitar estas extensiones de uso de claves |
|---|---|
| Autenticación de servidor web TLS | Firma digital, cifrado de clave o acuerdo de clave |
| Autenticación de cliente web TLS | Firma digital y/o acuerdo de clave |
| Firmar código ejecutable (descargable) | Firma digital |
| Protección de correo electrónico | Firma digital, no repudio y/o cifrado de clave o acuerdo de clave |
| Sistema final IPSEC (host o enrutador) | Firma digital y/o cifrado de clave o acuerdo de clave |
| Túnel IPSEC | Firma digital y/o cifrado de clave o acuerdo de clave |
De manera similar, para el uso de clave extendida (EKU), según el caso de uso, se deben elegir los siguientes valores:
| Tecla extendida | Habilitar estas extensiones de uso de claves |
|---|---|
| Usuario IPSEC | Firma digital y/o cifrado de clave o acuerdo de clave |
| Marcando la hora | Firma digital, no repudio. |
Por lo tanto, para el caso de uso de firma de código, requerimos Firma digital como uso de clave y firma de código como uso de clave mejorado

Ahora, ¿cómo agrego las extensiones KU y EKU en mi certificado?
Para agregarlos, necesitamos ejecutar el siguiente comando en OpenSSL:
openssl req -x509 -nodes -newkey rsa:4096 -keyout key.pem -out server.pem -days 365 -subj /CN=Nombre_del_certificado/C=US/OU=Su_OU/O=Nombre_de_su_organización -addext “keyUsage = firma_digital” -addext “extendedKeyUsage = firma_de_código”
Lugar:
CN = Nombre común del certificado (generalmente nombre de la organización en la firma de código)
C= Nombre del país
OU = Unidad organizativa (por ejemplo, Ingeniería, TI, etc.)
O= Nombre de la organización

Y esto generará los requisitos firma de código Certificado con extensión de uso de clave y uso de clave mejorado

Este certificado ahora se puede usar con éxito para cargar el paquete de Android a la Consola de firma de aplicaciones de Google Play.
