¿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 keytool
comando no funciona (la -jarfile
opción requiere Java 7), puede obtener información más básica a través del jarsigner
comando:
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.