¿Cómo firmar una APK con más de un certificado?

¿Cómo firmo un APK con más de un certificado, para poder hacerlo cuando publico en Android Market?

Versión 1.0 => Firmado con Certificado A
Versión 2.0 => Firmado con Certificado A y B
Versión 3.0 => Firmado con el Certificado B

El Android Market me da algo de esperanza pero no estoy seguro de qué hacer con él, cuando lo cargo con un certificado de firma diferente, me da este mensaje:

“La aplicación debe estar firmada con al menos un certificado en común con la versión anterior”.

Motivo:
Publiqué una aplicación en el mercado con Android Signing Tool como parte de MotoDev Studio para Android. El problema es que maneja las claves en sí y no hay forma (documentada) de obtenerlas. Quiero cambiarlo para usar un almacén de claves y un certificado que tenga más control y que pueda usar incluso si ya no uso MotoDev Studio. También parece que MotoDev Studio lo mantendrá fuera de las nuevas características, como las bibliotecas compartidas.

ACTUALIZACIÓN 5/3/2011:
En realidad, han sido muy rápidos y rápidos para actualizar MotoDev Studio, pero parece que creo que Google aún debe ofrecer una alternativa a aquellos que desean cambiar los certificados de sus aplicaciones. La actualización de la aplicación a todos usa el mismo certificado, creando nuevos a través del tiempo y posiblemente creando uno nuevo para que pueda entregar el soporte y la distribución de su aplicación a otros.

Si desea firmar una APK más de una vez, simplemente hágalo.
Pero tenga en cuenta que Google Play no acepta APK con múltiples firmas.

p.ej. Puede firmar un APK desde la línea de comando usando jarsigner como tal:
jarsigner -keystore original-keystore my-app-unsigned.apk key-alias alias

Entonces simplemente repita esto con la segunda clave:
jarsigner -keystore new-signing-keystore my-app-unsigned.apk key-alias

No te olvides de ejecutar zipalign después:
zipalign -v 4 my-app-unsigned.apk my-app.apk


Acabo de volver a leer la parte sobre el estudio de MotoDev. En ese caso, puede simplemente firmar la APK primero usando MotoDev como de costumbre, luego firme con su nueva clave en la línea de comando como se indica arriba.

Estuve muy contento de ver esta publicación hasta que vi el comentario de @ddcruver (2010-06-05) y el comentario de @cistearns (2011-03-01).

Sin embargo, hay un gran problema de seguridad con el método de transición que describes (si funcionara de la forma esperada), lo que hace que sea bastante trivial para un atacante reemplazar tu aplicación si pueden hacer que tus usuarios instalen sus cosas:

  • Lanza su aplicación firmada con el certificado A.
  • El atacante obtiene el apk, además lo firma con el certificado M y distribuye la aplicación.
  • El atacante puede liberar una aplicación maliciosa firmada con el certificado M para reemplazar la suya y obtener acceso a cualquier información que pueda estar almacenando.

Normalmente, si un atacante intenta reemplazar algo, la instalación se rechazará a menos que se elimine el original, momento en el que se borrarán los datos.

Por otro lado, todavía hay varios casos de uso válidos para la transición de una clave / certificado: renovación de clave, entrega a otro desarrollador, etc.

Esto podría hacerse de forma más segura al autorizar la transición a una nueva clave desde la clave anterior. Por favor vea el problema en el proyecto de Android .

Tuve el problema hoy y esto es lo que hice:

  1. Haga una copia de seguridad del antiguo archivo motodev.keystore
  2. Use un estudio reciente de motodev (2.0.1) para cambiar mi contraseña de motodev.keystore (cámbiela en la vista de motodev donde puede importar un almacén de claves)
  3. Convierta el archivo motodev keystore (de tipo JCEKS) en un archivo de almacén de claves android normal (de tipo JKS) usando el progtwig keytool.exe incluido con java:

keytool -importkeystore -srckeystore motodev.keystore -srckeystoretype JCEKS -destkeystore android.keystore -destkeystoretype JKS

Ahora el archivo android.keystore se puede usar en los complementos de Google Eclipse para exportar su aplicación a una APK firmada