Ir al contenido

Webinar: Regístrese para nuestro próximo seminario web

Regístrate Ahora

¿Por qué su certificado de firma de código no funcionará para Play App Signing?

Por qué su certificado de firma de código no funcionará para Play App Signing

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:

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.

utilizando 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

crear una clave privada

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

openssl genrsa -des3 -out carga.clave 4096

clave privada cifrada

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.

Solución de firma de código empresarial

Obtenga una solución para todas sus necesidades criptográficas de firma de código de software con nuestra solución de firma de código.

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

crear una RSE
Subir archivos txt

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

crear certificado con validez de 365 días

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.

Archivo .pfx generado

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.

Detalles del certificado

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 extendidaHabilitar estas extensiones de uso de claves
Autenticación de servidor web TLSFirma digital, cifrado de clave o acuerdo de clave
Autenticación de cliente web TLSFirma digital y/o acuerdo de clave
Firmar código ejecutable (descargable)Firma digital
Protección de correo electrónicoFirma 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 IPSECFirma 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 extendidaHabilitar estas extensiones de uso de claves
Usuario IPSECFirma digital y/o cifrado de clave o acuerdo de clave
Marcando la horaFirma 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

caso de uso de firma de código

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

Descripción general del comando OpenSSL

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

certificado de firma de código requerido

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