¿Qué tipo de pitfals existen para Android APK firma?

Descargo de responsabilidad: sé lo básico de la firma de un Apk y tengo un problema con uno solo de mis proyectos y sólo cuando firma con Microsoft Windows como sistema operativo.

Estoy construyendo mi APK con Maven y firmar con el maven-jarsigner-plugin:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jarsigner-plugin</artifactId>
    <executions>
      <execution>
        <id>signing</id>
        <goals>
          <goal>sign</goal>
        </goals>
        <phase>package</phase>
        <inherited>true</inherited>
        <configuration>
          <archive>target/${project.build.finalName}.apk</archive>
          <sigfile>CERT</sigfile>
          <keystore>${env.HOME}/.keystore</keystore>
          <storepass>${env.KEY_STOREPASS}</storepass>
          <keypass>${env.KEY_KEYPASS}</keypass>
          <alias>${env.KEY_ALIAS}</alias>
        </configuration>
      </execution>
    </executions>
  </plugin>

Ahora con uno de mis proyectos me sale el siguiente error al intentar instalar e iniciar la aplicación:

1360 KB/s (2057872 bytes in 1.477s)
        pkg: /data/local/tmp/FX-602P-Droid-5.0.0.apk
Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]

Como he dicho en la primera frase: funciona bien cuando firma con Mac OS X. sólo falla cuando se utiliza Windows 7 para firmar.

Utilizando --debug cuando se llama a Maven veo que la jarsigner se llama ok y no informa de ningún error:

[INFO]
[INFO] --- maven-jarsigner-plugin:1.2:sign (signing) @ FX-602P-Droid ---
[DEBUG] org.apache.maven.plugins:maven-jarsigner-plugin:jar:1.2:
[DEBUG]    org.apache.maven:maven-plugin-api:jar:2.0.6:compile
[DEBUG]    org.apache.maven:maven-project:jar:2.0.6:compile
[DEBUG]       org.apache.maven:maven-settings:jar:2.0.6:compile
[DEBUG]       org.apache.maven:maven-profile:jar:2.0.6:compile
[DEBUG]       org.apache.maven:maven-model:jar:2.0.6:compile
[DEBUG]       org.apache.maven:maven-artifact-manager:jar:2.0.6:compile
[DEBUG]          org.apache.maven:maven-repository-metadata:jar:2.0.6:compile
[DEBUG]       org.apache.maven:maven-plugin-registry:jar:2.0.6:compile
[DEBUG]       org.codehaus.plexus:plexus-container-default:jar:1.0-alpha-9-stable-1:compile
[DEBUG]          junit:junit:jar:3.8.1:compile
[DEBUG]          classworlds:classworlds:jar:1.1-alpha-2:compile
[DEBUG]    org.apache.maven:maven-artifact:jar:2.0.6:compile
[DEBUG]    org.codehaus.plexus:plexus-utils:jar:1.5.15:compile
[DEBUG] Created new class realm plugin>org.apache.maven.plugins:maven-jarsigner-plugin:1.2
[DEBUG] Importing foreign packages into class realm plugin>org.apache.maven.plugins:maven-jarsigner-plugin:1.2
[DEBUG]   Imported:  < project>net.sourceforge.uiq3:FX-602P-Droid:5.0.0
[DEBUG] Populating class realm plugin>org.apache.maven.plugins:maven-jarsigner-plugin:1.2
[DEBUG]   Included: org.apache.maven.plugins:maven-jarsigner-plugin:jar:1.2
[DEBUG]   Included: junit:junit:jar:3.8.1
[DEBUG]   Included: org.codehaus.plexus:plexus-utils:jar:1.5.15
[DEBUG]   Excluded: org.apache.maven:maven-plugin-api:jar:2.0.6
[DEBUG]   Excluded: org.apache.maven:maven-project:jar:2.0.6
[DEBUG]   Excluded: org.apache.maven:maven-settings:jar:2.0.6
[DEBUG]   Excluded: org.apache.maven:maven-profile:jar:2.0.6
[DEBUG]   Excluded: org.apache.maven:maven-model:jar:2.0.6
[DEBUG]   Excluded: org.apache.maven:maven-artifact-manager:jar:2.0.6
[DEBUG]   Excluded: org.apache.maven:maven-repository-metadata:jar:2.0.6
[DEBUG]   Excluded: org.apache.maven:maven-plugin-registry:jar:2.0.6
[DEBUG]   Excluded: org.codehaus.plexus:plexus-container-default:jar:1.0-alpha-9-stable-1
[DEBUG]   Excluded: classworlds:classworlds:jar:1.1-alpha-2
[DEBUG]   Excluded: org.apache.maven:maven-artifact:jar:2.0.6
[DEBUG] Configuring mojo org.apache.maven.plugins:maven-jarsigner-plugin:1.2:sign from plugin realm ClassRealm[plugin>org.apache.maven.plugins:maven-jarsigner-plugin:1.
2, parent: sun.misc.[email protected]]
[DEBUG] Configuring mojo 'org.apache.maven.plugins:maven-jarsigner-plugin:1.2:sign' with basic configurator -->
[DEBUG]   (f) alias = krischik
[DEBUG]   (f) archive = C:\Work\uiq3\Java\FX-602P-Droid\target\FX-602P-Droid-5.0.0.apk
[DEBUG]   (f) arguments = []
[DEBUG]   (f) keypass = Atlan.
[DEBUG]   (f) keystore = C:\Users\martin.krischik/.keystore
[DEBUG]   (f) processAttachedArtifacts = true
[DEBUG]   (f) processMainArtifact = true
[DEBUG]   (f) project = MavenProject: net.sourceforge.uiq3:FX-602P-Droid:5.0.0 @ C:\Work\uiq3\Java\FX-602P-Droid\pom.xml
[DEBUG]   (f) removeExistingSignatures = false
[DEBUG]   (f) sigfile = CERT
[DEBUG]   (f) skip = false
[DEBUG]   (f) storepass = !AtlanRhodan!
[DEBUG]   (f) verbose = false
[DEBUG] -- end configuration --
[DEBUG] Verarbeite C:\Work\uiq3\Java\FX-602P-Droid\target\FX-602P-Droid-5.0.0.apk
[DEBUG] 'cmd.exe /X /C "C:\opt\Java\jdk\1.7.0\bin\jarsigner.exe -keystore C:\Users\martin.krischik/.keystore -storepass '*****' -keypass '*****' -sigfile CERT C:\Work\u
iq3\Java\FX-602P-Droid\target\FX-602P-Droid-5.0.0.apk krischik"'
[INFO] 1 Archiv(e) verarbeitet
[INFO]

¿Qué otra cosa podría haber ido mal?

PS: acabo de señalar C:\opt\Java\jdk\1.7.0\bin\jarsigner.exe — Ha habido un cambio en la jarsigner de 1.6 a la 1.7? Y ¿por qué Maven utilizar el 1.7 firmante para un 1.6 proyecto?

  • Actualización: de hecho, es un problema con el jarsigner. El uso de la 1.6 jar-firmante de la línea de comandos funciona como se esperaba. — Así que esto se convierte en un maven pregunta: cómo especificar la jarsigner para uso en maven?
  • Actualización: El 1.7 jarsigner utiliza un algoritmo diferente, lo cual es incompatible con Android.
  • Este seguimiento se realiza como un error aquí code.google.com/p/android/issues/detail?id=19567
  • Pero creo que esto debe ser corregido en maven-jarsigner-plugin es el mismo que se fija en la HORMIGA ya, véase: issues.apache.org/bugzilla/show_bug.cgi?id=52344
InformationsquelleAutor Martin | 2012-01-05

4 Kommentare

  1. 45

    La solución es agregar esto a la <configuration> de la maven-jarsigner-plugin:

    <arguments>
      <argument>-sigalg</argument><argument>MD5withRSA</argument>
      <argument>-digestalg</argument><argument>SHA1</argument>
    </arguments>

    Hormiga ya tiene el apoyo directo para esto, pero el plugin de Maven no.

    • ¿Ha creado un informe de error/solicitud de función o incluso un parche para el jarsigner plugin…
    • No. No tengo cuenta aquí. Pero el problema similar ya existe jira.codehaus.org/browse/MJARSIGNER-21, pero no sugieren solucionarlo en el hormiguero manera 🙁
    • Moser: no es un jarsigner error, sino un Androide característica indeseable.
    • No esta es la característica que falta en maven-jarsigner-plugin
    • Moser: ¿cómo? Yo, sin embargo, el maven-jarsigner-plug-in plug-in no está ahí sólo para firmar las aplicaciones de android.
    • Sí.. el jarsigner plugin es para otra firma así.
    • Trabajó para mí. Tuve que poner las líneas en la raíz del pom.
    • Jdk7 necesidad de establecer esta argumentos.

  2. 10

    Es muy difícil encontrar información sobre el uso con la 1.7, pero una vez encontrado es razonable simple:

    Para keytool incluyen:

    -sigalg SHA1withDSA -keyalg DSA -keysize 1024

    Para jarsigner incluyen:

    -sigalg SHA1withDSA -digestalg SHA1

    (1024 es el máximo y obras, menos podría hacer el truco)

    • No muy jarsigner error: java.security.SignatureException: private key algorithm is not compatible with signature algorithm
    • Tengo el mismo error, como Martin cuando se utiliza esta configuración. El cambio de la keytool args a -sigalg MD5withRSA -keyalg RSA -keysize 1024 trabajó para mí.
    • La Baqueta, lo que si desea utilizar la llave de la original y no generar una nueva? Tengo el mismo problema como Martin
  3. 2

    La solución de la Baqueta también funciona para mí.

    El uso de estos argumentos en el keytool:

    -sigalg MD5withRSA -keyalg RSA -keysize 1024 

    Estoy usando todavía hay en jarsigner:

    -sigalg MD5withRSA -digestalg SHA1

    Gracias, la APK compilado e instalado en un equipo con Java 7, ¡por fin!

  4. 0

    Gracias… me ayudó en la corrección de la firma de los problemas…

    jarsigner -verbose -sigalg SHA1withRSA -digestalg
    keytool -sigalg MD5withRSA -keyalg RSA

    Por último, no te olvides de zipalign.

    He usado similar keytool y jarsigner métodos y el asunto estaba resuelto.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea