Actualmente estoy desarrollando una biblioteca de Android .AAR y me gustaría firmar los artefactos lanzados con mi propia clave, para poder determinar si un aar falso con el mismo nombre y funcionalidad ha sido lanzado por mí o no.
Aviso 1:
Quiero poder verificar la autenticidad de mi biblioteca mediante programación, incluso si una falsificada está falsificando solo una parte de la funcionalidad de mi archivo aar.
Aviso 2:
No voy a publicar este aar en maven, sonatype o cualquier otro repositorio público. Así que voy a firmarlo para un flujo de lanzamiento típico, como firmar un archivo apk.
Puede usar jarsigner para firmar su biblioteca aar , y puede usar keytool para generar las claves de firma. Ambas herramientas se encuentran en el JDK integrado que viene con Android Studio. Haga lo siguiente para firmar su biblioteca.
Genere un almacén de claves con un par de claves. Deberá proporcionar los campos del certificado:
keytool -genkeypair -alias aarsign -keypass mypassword -keystore aarsign.keystore -storepass mypassword -vExporte el certificado generado a un archivo PEM:
keytool -exportcert -rfc -alias aarsign -file aarsign-public.pem -keystore aarsign.keystore -storepass mypassword -vCree un almacén de claves que contenga el certificado:
keytool -importcert -alias aarsign -file aarsign-public.pem -keystore aarsign-public.keystore -storepass mypassword -vFirma la biblioteca:
jarsigner -keystore aarsign.keystore -storepass mypassword -keypass mypassword -signedjar lib-signed.aar -verbose lib.aar aarsignCualquiera que desee atestiguar la autenticidad de la biblioteca debe obtener su certificado (o el almacén de claves con él) de manera confiable e ingresar este comando:
jarsigner -keystore aarsign-public.keystore -storepass mypassword -verify -verbose -certs lib-signed.aar aarsignDará el mensaje
jar verified. con algunas advertencias sobre la caducidad del certificado y la marca de tiempo de la firma. Puede deshacerse de estas advertencias creando un certificado más estricto. Consulte la documentación de keytool y jarsigner .
Hay dos formas en las que puede averiguar si su biblioteca ha sido manipulada: resúmenes no coincidentes o certificados no coincidentes. Si alguien genera un aar a partir de un código fuente diferente o con diferentes recursos, el resumen no coincidirá y jarsigner advertirá, por ejemplo:
jarsigner: java.lang.SecurityException: invalid SHA-256 signature file digest for <file> Y, si alguien proporciona un certificado diferente al tuyo, jarsigner te avisará:
Warning: This jar contains entries whose certificate chain is not validated. This jar contains signed entries which are not signed by the specified alias(es). This jar contains signed entries that are not signed by alias in this keystore.Porque variant.signingConfig no funciona para mí, he usado
apply plugin: 'com.android.library' ... android { ... signingConfigs { release { storeFile file("${rootProject.projectDir}/keystore.jks") storePassword "XXXX" keyAlias "alias" keyPassword "XXXX" } } ... } tasks.whenTaskAdded { task -> if (task.name == 'assembleRelease') { def aarPath = "${project.buildDir}/outputs/aar/XXX-release.aar" task.doLast { ant.signjar( alias: android.signingConfigs.release.keyAlias, jar: aarPath, keystore: android.signingConfigs.release.storeFile, storepass: android.signingConfigs.release.storePassword, keypass: android.signingConfigs.release.keyPassword, preservelastmodified: 'true') ant.verifyjar( alias: android.signingConfigs.release.keyAlias, jar: aarPath, keystore: android.signingConfigs.release.storeFile, storepass: android.signingConfigs.release.storePassword, keypass: android.signingConfigs.release.keyPassword) } } }Puedes generarlo ejecutando:
./gradlew assembleReleaseO desde el menú Gradle, en el lado derecho de Android Studio, seleccione YourLibraryProject->Tasks->Build->AssembleRelease.
Pero, por supuesto, debe agregar la clave de firma en su proyecto de biblioteca. Lea en Firme su aplicación