El apk debe estar firmado con los mismos certificados que la versión anterior

200

Había subido mi aplicación a Google Play (cuando se llamaba Android Market) hace algún tiempo.

Hoy actualicé la aplicación, pero eliminé el almacén de claves anterior y creé una nueva.
Al cargar, dice que el APK debe estar firmado con los mismos certificados que la versión anterior:

Subida fallida

Cargó un APK que está firmado con un certificado diferente a sus APK anteriores. Debes usar el mismo certificado.

Sus APK existentes están firmados con los certificados con huella digital:
[SHA1: 89: 2F: 11: FE: CE: D6: CC: DF: 65: E7: 76: 3E: DD: A7: 96: 4F: 84: DD: BA: 33]
y los certificados utilizados para firmar el APK que cargó tienen huellas digitales:
[SHA1: 20: 26: F4: C1: DF: 0F: 2B: D9: 46: 03: FF: AB: 07: B1: 28: 7B: 9C: 75: 44: CC]

Pero no tengo este certificado, y no quiero eliminar y volver a publicar la aplicación, ya que tiene usuarios activos.

¿Qué puedo hacer para firmar mi aplicación con un nuevo certificado?

artem
fuente
26
Tengo un problema diferente: intenté actualizar una aplicación pero me sigue diciendo este error. El hecho es que nunca he cambiado el almacén de claves. ¿¡¿Que puedo hacer?!?
Mariux
¿Cómo lo resolviste?
Elizabeth
@ int_32 ¿cómo lo resuelves?
Amit Sharma

Respuestas:

187

Nada. Lea la documentación: Publicación de actualizaciones en Android Market

Antes de cargar la aplicación actualizada, asegúrese de haber incrementado los atributos android: versionCode y android: versionName en el elemento del archivo de manifiesto. Además, el nombre del paquete debe ser el mismo y el .apk debe estar firmado con la misma clave privada. Si el nombre del paquete y el certificado de firma no coinciden con los de la versión existente, Market lo considerará una nueva aplicación y no lo ofrecerá a los usuarios como una actualización.

Rubycon
fuente
14
Gran respuesta. Nunca me di cuenta de que si se pierde la clave, la aplicación no se puede actualizar. Debe tener en cuenta para hacer una copia de seguridad de la clave en un lugar seguro.
Peter Knego
18
Lo que haría normalmente es almacenar el archivo de almacén de claves en svn. Coloque una nueva carpeta llamada credencial, junto con troncal / etiqueta / ramas, y almacene el archivo de almacén de claves allí. Agregue también un nuevo archivo .txt que indique el archivo del almacén de claves. Keystore es tan importante como el código fuente . Una vez que la perdió (o se olvidó la contraseña) que se atornillan ..
Krishnabhadra
42
Por favor NO comprobar la contraseña del almacén de claves (o cualquier contraseña para el caso) en el control de código fuente, como dice @Krishnabhadra. Mantenga el almacén de claves y la contraseña separados, y la contraseña segura.
Christopher Orr
1
¡¿Qué?! Pero solo me dijo que mi clave era demasiado vieja, así que la eliminé y creé una nueva, ¡ahora entiendo esto!
2
@iwayneo El sistema de compilación podría haberle dicho que su clave de depuración era demasiado antigua, pero es muy poco probable que haya sucedido con una clave de lanzamiento , ya que Google Play debería rechazar las claves que caducan antes de octubre de 2033 .
Christopher Orr
127

¿Firmaste con la clave de depuración por error?

Google Play no le permite publicar una aplicación firmada con su almacén de claves de depuración. Si intenta cargar un APK de este tipo, Google Play fallará con el mensaje "Cargó un APK que se firmó en modo de depuración. Debe firmar su APK en modo de lanzamiento".

Sin embargo, si intenta cargar una actualización que está firmada con el almacén de claves de depuración, no verá este mensaje; Google Play mostrará el mensaje que se muestra en la pregunta, en referencia a las huellas digitales SHA1.

En primer lugar, verifique si firmó la aplicación con su clave de depuración por error.


¿Cómo verifico qué claves de firma se usaron?

Recopila la información del APK

Puede verificar con qué certificados se firmaron el APK original y el APK de actualización utilizando estos comandos, utilizando Java keytool:

keytool -list -printcert -jarfile original.apk
keytool -list -printcert -jarfile update.apk

Esto le muestra información detallada sobre cómo se firmó un APK, por ejemplo:

Owner: CN=My App, O=My Company, L=Somewhere, C=DE
Issuer: CN=My App, O=My Company, L=Somewhere, C=DE
Serial number: 4790b086
Valid from: Mon Nov 11 15:01:28 GMT 2013 until: Fri Mar 29 16:01:28 BST 2041
Certificate fingerprints:
  MD5:  A3:2E:67:AF:74:3A:BD:DD:A2:A9:0D:CA:6C:D4:AF:20
  SHA1: A6:E7:CE:64:17:45:0F:B4:C7:FC:76:43:90:04:DC:A7:84:EF:33:E9
  SHA256: FB:6C:59:9E:B4:58:E3:62:AD:81:42:...:09:FC:BC:FE:E7:40:53:C3:D8:14:4F
         Signature algorithm name: SHA256withRSA
         Version: 3

Las partes importantes a tener en cuenta aquí, para cada APK, son el valor de la huella digital SHA1 , el valor de identidad del propietario y las fechas válidas desde / hasta .


Si ese keytoolcomando no funciona (la -jarfileopción requiere Java 7), puede obtener información más básica a través del jarsignercomando:

jarsigner -verify -verbose:summary -certs original.apk
jarsigner -verify -verbose:summary -certs update.apk

Desafortunadamente, esto no muestra la huella digital SHA1, pero sí muestra la identidad del propietario X.509, junto con las fechas de vencimiento del certificado. Por ejemplo:

sm  4642892 Thu Apr 17 10:57:44 CEST 2014 classes.dex (and 412 more)

    X.509, CN=My App, O=My Company, L=Somewhere, C=DE
    [certificate is valid from 11/11/13 12:12 to 29/03/41 12:12]
    [CertPath not validated: Path does not chain with any of the trust anchors]

Puede ignorar cualquier mensaje "CertPath no validado", junto con advertencias sobre cadenas de certificados o marcas de tiempo; No son relevantes en este caso.

Compare los valores Propietario, SHA1 y Caducidad entre los APK

  • Si el valor de identidad Propietario / X.509 es CN=Android Debug, O=Android, C=US, ha firmado el APK con su clave de depuración , no con la clave de lanzamiento original

  • Si el valor de la huella digital SHA1 es diferente entre los APK originales y de actualización, entonces no usó la misma clave de firma para ambos APK

  • Si los valores de identidad del Propietario / X.509 son diferentes, o las fechas de vencimiento del certificado difieren entre los dos APK, entonces no usó la misma clave de firma para ambos APK

Tenga en cuenta que incluso si los valores Propietario / X.509 son idénticos entre los dos certificados, esto no significa que los certificados sean idénticos, si algo más no coincide, como los valores de huellas digitales, entonces los certificados son diferentes.


Busque el almacén de claves original, verifique las copias de seguridad

Si los dos APK tienen información de certificado diferente, entonces debe encontrar el almacén de claves original, es decir, el archivo con el primer valor de huella digital SHA1 que Google Play (o keytool) le indicó.

Busque en todos los archivos del almacén de claves que puede encontrar en su computadora y en cualquier copia de seguridad que tenga, hasta que tenga el que tenga la huella digital SHA1 correcta:

keytool -list -keystore my-release.keystore

Simplemente presione Entersi se le solicita la contraseña; no necesariamente tiene que ingresarla si solo desea verificar rápidamente el valor SHA1.


No puedo encontrar el almacén de claves original en ningún lado

Si no puede encontrar el almacén de claves original, nunca podrá publicar ninguna actualización de esta aplicación en particular.

Android menciona esto explícitamente en la página Firmando su aplicación :

Advertencia: mantenga su almacén de claves y su clave privada en un lugar seguro y protegido, y asegúrese de tener copias de seguridad seguras de ellos. Si publica una aplicación en Google Play y luego pierde la clave con la que firmó su aplicación, no podrá publicar ninguna actualización, ya que siempre debe firmar todas las versiones de su aplicación con la misma clave.

Después del primer lanzamiento de un APK, todos los lanzamientos posteriores deben firmarse con la misma clave.


¿Puedo extraer la clave de firma original del APK original?

No. Esto no es posible. El APK solo contiene información pública, y no su información de clave privada.


¿Puedo migrar a una nueva clave de firma?

No. Incluso si encuentra el original, no puede firmar un APK con la tecla A, luego firmar la próxima actualización con las teclas A y B, y luego firmar la próxima actualización solo con la tecla B.

Es técnicamente posible firmar un APK (o cualquier archivo JAR) con varias claves , pero Google Play ya no acepta APK con múltiples firmas.

Si lo intenta, aparecerá el mensaje "Su APK se ha firmado con varios certificados. Firme solo con un certificado y cárguelo de nuevo".


¿Que puedo hacer?

Tendrá que crear su aplicación con un nuevo ID de aplicación (por ejemplo, cambiar de "com.example.myapp" a "com.example.myapp2") y crear una nueva lista en Google Play.

Posiblemente también tendrá que cambiar su código para que las personas puedan instalar la nueva aplicación incluso si tienen instalada la aplicación anterior, por ejemplo, debe asegurarse de no tener proveedores de contenido en conflicto.

Perderá su base de instalación existente, revisiones, etc., y tendrá que encontrar una manera de hacer que sus clientes existentes desinstalen la aplicación anterior e instalen la nueva versión.

Nuevamente, asegúrese de tener copias de seguridad seguras del almacén de claves y las contraseñas que usa para esta versión.

Christopher Orr
fuente
He intentado el comando que le dio, para verificar la depuración (que en realidad estaba buscando), pero devuelve un error de que el jar contiene firmas que no incluyen una marca de tiempo. Creé mi apk usando este hilo: stackoverflow.com/questions/16622843/…
CularBytes
@RageCompex ¿No obtiene resultados y solo un error? Cuando ejecuto ese comando, también recibo una advertencia de marca de tiempo (no es un error). Siempre que obtenga la salida X.509, eso es todo lo que necesita.
Christopher Orr
Sí, obtengo la salida X.509, así que supongo que no es un problema. ¿Qué pasa [CertPath not validated: Path does not chain with any of the trust anchors], no es un problema eather? Sí veo mi nombre, CNasí que supongo que lo firmé correctamente :)
CularBytes
@RageCompex Esto ya se respondió en la sección "Verificar las claves de firma utilizadas".
Christopher Orr
Tuve un mini ataque al corazón hoy. Usé estas líneas de comando para descubrir el Keystore oculto. ¡Muchas gracias hombre! Me salvaste ... Realmente: D
Ajeet
11

Nada: Google dice claramente que la aplicación se identifica con las teclas utilizadas para firmarla. En consecuencia, si ha perdido las claves, debe crear una nueva aplicación.

Devolución de llamada de Eugene Mayevski
fuente
1
@sports Ellos hacen advertirle. Observe el gran mensaje de advertencia rojo : developer.android.com/tools/publishing/…
Christopher Orr
2
@sports En cualquier caso, puede publicar más de una aplicación en la misma cuenta de desarrollador, por lo que no necesita volver a pagar.
Christopher Orr
7

Hoy enfrenté el mismo problema, desafortunadamente, tenía dos alias en mi archivo de almacén de claves.ingrese la descripción de la imagen aquí

Krishan
fuente
7

Acabo de que esto ocurra de la nada azul claro. Realmente no creo que haya cambiado nada.

Sin embargo, lo Build => Clean Projectarregló.

Dave Hubbard
fuente
1
Hmm, he estado pasando 1 semana, hice todo lo posible. y es hora de decir "WTF", pero es lo único que ayudó. (También he intentado invalidar cachés que no ayudaron ...) Gracias
Upsilon42
1
Esto solucionó el problema después de volverse loco durante una hora
Boris Legovic el
Gracias por esto; ¡Es un verdadero salvavidas!
Ian Mbae
No veo que esto esté relacionado.
Infinite Loops
¡Muchas gracias!. Accidentalmente generé un apk firmado con diferentes archivos y credenciales del almacén de claves y lo subí. Seguí recibiendo el mismo error incluso después de cargar apk con el almacén de claves correcto. Después de una hora de crear nuevas versiones con invalidar caché, Android Studio y reinicios de PC, esto finalmente lo solucionó.
Arun
5

Aquí obtengo la respuesta a esa pregunta. Después de buscar durante mucho tiempo, finalmente puedo descifrar la clave y la contraseña para esto. Olvidé mi clave y alias también el archivo jks, pero afortunadamente sé el montón de contraseña que había puesto en él. pero encontrar las combinaciones correctas para esa fue la tarea más difícil para mí.

Solución - Descargue esto - Keytool IUI versión 2.4.1 plugin ingrese la descripción de la imagen aquí

la ventana aparecerá ahora y mostrará el nombre del alias ... si su archivo jks es correcto ... haga clic derecho en el alias y presione "ver cadena de certificados" ... mostrará la clave SHA1 ... haga coincidir esta clave con la clave que obtenga mientras cargabas el apk en la tienda de aplicaciones de Google ...

si coincide, entonces estás con el archivo jks y el alias correctos.

ahora afortunado tengo un montón de contraseña para que coincida .. ingrese la descripción de la imagen aquí

ahora vaya a este scrren coloque la misma ruta jks ... y la contraseña (entre la contraseña que tiene) ponga cualquier ruta en "Archivo de certificado"

si la pantalla muestra algún error, la contraseña no coincide ... si no muestra ningún error, significa que está con el archivo jks correcto. alias y contraseña correctos () ahora con eso puedes subir tu apk en Play Store :)

Arun Yadav
fuente
perdió la clave privada y pudo recuperarla de esta manera? Si la respuesta es sí, ¿es posible vincular dónde descargar la herramienta? ¿Y cómo abro la aplicación?
LS_
4

Si tiene un archivo apk anterior con usted (copia de seguridad), use jarSigner para extraer el certificado de ese apk, luego use esa clave o use keytool para clonar ese certificado, puede ser que ayude ... Los enlaces útiles son documentos jarsigner y documentos keytool .

om252345
fuente
55
"..use jarSigner para extraer el certificado de esa apk" - ¿Dinos cómo hacer esto?
Rubycon
14
Eso no recuperará la clave privada que necesitarías para volver a firmar el apk.
botteaap
Apk debe estar firmado con la misma clave privada
om252345
3

Recomiendo encarecidamente Keystore Explorer ( https://keystore-explorer.org/ ) que le permite acceder a su almacén de claves sin tener que cargarlo en Google Play. De esta forma, puede solucionar problemas si está ingresando su contraseña incorrectamente.

drdiv
fuente
1

Puede usar la nueva función de firma de aplicaciones de Google Play para generar un nuevo archivo de clave.

Después de mayo de 2017, Google Play Store agrega una nueva característica en Play Store y es una buena noticia para los desarrolladores de Android. Desde esta característica, el Desarrollador puede actualizar su aplicación o Apk que perdió un archivo KeyStore. debes habilitar el inicio de sesión de la aplicación Google Play en la consola Play Store.

https://support.google.com/googleplay/android-developer/answer/7384423?hl=en

http://www.geekcodehub.com/2018/05/23/keystore-lost-in-android/

Jack
fuente
0

Recientemente me enfrenté a este problema, después de probar diferentes formas de iniciar sesión, como habilitar V1 o V2, inicié sesión cambiando el nombre del alias y la última vez que supe que estoy usando un archivo de almacén de claves incorrecto

usuario2837615
fuente
0

Mi error [tonto] fue que usé el archivo app-debug.apk en lugar del archivo app-release.apk. Debes elegir "liberar" en el marco "Construir variantes" cuando generas un APK firmado. El archivo app-release.apk debe ubicarse en la carpeta "app \ release" en la raíz del proyecto.

M. Marmor
fuente