web-dev-qa-db-fra.com

Comment signer Android app avec les clés de la plateforme en utilisant gradle?

J'ai vu quelques questions similaires comme:

mais je sens que mon problème est différent.

Tout d'abord j'utilise:

Android: sharedUserId = "Android.uid.system"

je dois donc signer mon application avec la clé de plate-forme. Je suis capable de faire cela de cette manière:

cd $Android_ROOT/out/Host/linux-x86/framework
Java -Djava.library.path=$Android_ROOT/out/Host/linux-x86/lib64 -jar signapk.jar $Android_ROOT/build/target/product/security/platform.x509.pem $Android_ROOT/build/target/product/security/platform.pk8 $APP_DIR/app/build/outputs/apk/debug/app-debug.apk $APP_DIR/MyApp-signed.apk

Cependant, je veux faire de la signature à partir de Gradle, j'ai donc généré un fichier jks de la manière this :

./keytool-importkeypair -k my_keystore.jks -p my_password -pk8 $Android_ROOT/build/target/product/security/platform.pk8 -cert $Android_ROOT/build/target/product/security/platform.x509.pem -alias platform

et j'ai modifié app/build.gradle pour avoir:

 signingConfigs {
     release {
         storeFile file("my_keystore.jks")
         storePassword "my_password"
         keyAlias "platform"
         keyPassword "my_password"
     }
 }

 buildTypes {
     release {
         minifyEnabled false
         proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'

         signingConfig signingConfigs.release
     }
 }

J'ai vérifié que my_keystore.jks possède un alias de plate-forme avec:

keytool -list -v -keystore my_keystore.jks | grep Alias
Alias name: platform

mais quand j'essaye de faire:

./gradlew assembleRelease

ou:

./gradlew signingReport

Je reçois:

Impossible de lire la plate-forme de clés du magasin "(...)/my_keystore.jks": format de magasin de clés non valide

Mise à jour: J'ai essayé de suivre dr_g conseils et je suis capable pour signer l'application en utilisant Android Studio (Build -> Generate Signed APK), donc je suppose que le magasin de clés est correct, mais j'obtiens toujours la même erreur lors de l'utilisation d'assembleRelease. J'ai également essayé de générer mon propre keystore comme suggéré par deadfish et en effet keystore généré par Android Studio est très bien pour gradle et assembler). clé de plate-forme, donc je ne peux pas l'utiliser malheureusement.

Problème résolu: Il s'est avéré que mon problème était en effet différent de ceux que j'ai mentionnés. Il était lié au keytool utilisé pour générer des clés (pas gradle), et c'était parce que bien que mon défaut Java était de 8, mon keytool par défaut était de Java 10 … Quand je suis passé à keytool depuis Java 8 tout a commencé à bien fonctionner.

10
LLL

pour créer un fichier de clés à partir des fichiers x509.pem et pk8 , vous pouvez utiliser ce script platform_import_keystore qui est similaire à keytool-importkeypair , mais étant donné que keytool-importkeypair ne fonctionne pas si vous n'avez pas déjà un magasin de clés, platform_import_keystore fera l'affaire.

J'espère que cela aidera.

MODIFIER:

Le script platform_import_keystore utilise la commande par défaut keytool. Vous devez vous assurer que la commande keytool utilisée dans le script provient de Java 8. Cela influence le format de fichier de clés obtenu par keytool.

1
VelocityPulse

Veuillez essayer d'utiliser la variante .keystore. Il pourrait y avoir des moyens de corriger le format Java keystore (.jks) mais cela prendra probablement plus de temps.

1) Générez votre fichier .keystore à partir de vos fichiers de clés séparés

$ openssl pkcs8 -inform DER -nocrypt -in \
  $Android_ROOT/build/target/product/security/platform.pk8 -out platform.key
$ openssl pkcs12 -export -in \
  $Android_ROOT/build/target/product/security/platform.x509.pem -inkey \
  platform.key -name platform -out platform.pem -password pass:password
$ keytool -importkeystore -destkeystore platform.keystore -deststorepass \
  password -srckeystore platform.pem -srcstoretype PKCS12 -srcstorepass 
  password

2) Testez votre nouveau magasin de clés:

$ jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore \
  platform.keystore -storepass password your-app.apk platform

3) Déployez le magasin de clés dans votre build Gradle:

signingConfigs {
 debug {
    storeFile     file('debug.keystore')
    storePassword 'Android'
    keyAlias      'androiddebugkey'
    keyPassword   'Android'
 }
 release {
    storeFile     file('platform.keystore')
    storePassword 'password'
    keyAlias      'platform'
    keyPassword   'password'
 } 
}

Le build.gradle ci-dessus montre également un exemple d'utilisation du magasin de clés de débogage Android comme standard pour les builds de débogage.

9
dr_g

Après avoir discuté avec deadfish et suivi ses suggestions (merci pour votre aide!), J'ai trouvé la solution de contournement suivante dans app/build.gradle (inside Android {}) :

applicationVariants.all { variant ->
    variant.assemble.doLast {
        exec {
            commandLine 'sh', '../mySigningScript.sh'
        }
    }
}

Cela exécutera mon script à chaque fois que assembleDebug ou assembleRelease est terminé. Je n'accepterai pas ma réponse car elle ne répond pas à ma question et cela m'oblige à supprimer la signature de configuration de Gradle mais au moins c'est une solution de contournement qui pourrait potentiellement être utilisée si aucune meilleure solution n'est proposée.

1
LLL

utilisez le fichier .keystore et non le .jks lorsque vous générez votre application, Android studio remarquera que vous créez un magasin de clés, essayez cette clé.

0
Devilsen