Você assinou com a chave de depuração por engano?
O Google Play não permite que você publique um aplicativo assinado com seu keystore de depuração. Se você tentar fazer o upload de um APK desse tipo, o Google Play falhará com a mensagem "Você enviou um APK assinado no modo de depuração. Você precisa assinar o APK no modo de liberação".
No entanto, se você tentar carregar uma atualização assinada com o keystore de depuração, você não verá esta mensagem; O Google Play exibirá a mensagem mostrada na pergunta, referindo-se às impressões digitais SHA1.
Então, primeiro, verifique se você assinou o aplicativo com sua chave de depuração por engano.
Como verifico quais chaves de assinatura foram usadas?
Reúna as informações do APK
Você pode verificar com quais certificados o APK original e o APK de atualização foram assinados usando estes comandos, usando o Java keytool
:
keytool -list -printcert -jarfile original.apk
keytool -list -printcert -jarfile update.apk
Isso mostra informações detalhadas sobre como um APK foi assinado, por exemplo:
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
As partes importantes a serem observadas aqui - para cada APK - são o valor da impressão digital SHA1 , o valor da identidade do proprietário e as datas válidas de / até .
Se esse keytool
comando não funcionar (a -jarfile
opção requer Java 7), você pode obter informações mais básicas através do jarsigner
comando:
jarsigner -verify -verbose:summary -certs original.apk
jarsigner -verify -verbose:summary -certs update.apk
Infelizmente, isso não mostra a impressão digital SHA1, mas mostra a identidade do proprietário X.509, juntamente com as datas de validade do certificado. Por exemplo:
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]
Você pode ignorar qualquer mensagem "CertPath não validado", juntamente com avisos sobre cadeias de certificados ou registros de data e hora; eles não são relevantes neste caso.
Compare os valores Proprietário, SHA1 e Expiração entre os APKs
Se o valor da identidade Proprietário / X.509 for CN=Android Debug, O=Android, C=US
, você assinou o APK com sua chave de depuração , não a chave de versão original
Se o valor da impressão digital SHA1 for diferente entre os APKs originais e de atualização, você não utilizou a mesma chave de assinatura nos dois APKs
Se os valores de identidade do Proprietário / X.509 forem diferentes ou as datas de validade do certificado diferirem entre os dois APKs, você não utilizou a mesma chave de assinatura nos dois APKs
Observe que, mesmo que os valores de Proprietário / X.509 sejam idênticos entre os dois certificados, isso não significa que os certificados sejam idênticos - se alguma outra coisa não corresponder - como os valores da impressão digital -, os certificados serão diferentes.
Pesquise o keystore original, verifique os backups
Se os dois APKs tiverem informações de certificado diferentes, você deverá encontrar o keystore original, ou seja, o arquivo com o primeiro valor de impressão digital SHA1 que o Google Play (oukeytool
informado pelo ).
Pesquise todos os arquivos de keystore que você pode encontrar no seu computador e em todos os backups que você possui, até encontrar o com a impressão digital SHA1 correta:
keytool -list -keystore my-release.keystore
Basta pressionar Enterse for solicitada a senha - você não precisa necessariamente inseri-la se quiser verificar rapidamente o valor SHA1.
Não consigo encontrar o keystore original em nenhum lugar
Se você não conseguir encontrar o keystore original, nunca poderá publicar nenhuma atualização neste aplicativo específico.
O Android menciona isso explicitamente na página Como assinar seu aplicativo :
Aviso: mantenha seu keystore e chave privada em um local seguro e verifique se você possui backups seguros deles. Se você publicar um aplicativo no Google Play e, em seguida, perder a chave com a qual o assinou, não poderá publicar nenhuma atualização, pois você sempre deve assinar todas as versões do aplicativo com a mesma chave.
Após o primeiro lançamento de um APK, todos os lançamentos subsequentes devem ser assinados com a mesma chave exata.
Posso extrair a chave de assinatura original do APK original?
Não. Isso não é possível. O APK contém apenas informações públicas e não suas informações de chave privada.
Posso migrar para uma nova chave de assinatura?
Não. Mesmo se você encontrar o original, não poderá assinar um APK com a chave A, assinar a próxima atualização com as duas teclas A e B e assinar a próxima atualização depois com apenas a tecla B.
É tecnicamente possível assinar um APK (ou qualquer arquivo JAR) com várias chaves , mas o Google Play não aceita mais APKs com várias assinaturas.
Tentar fazer isso resultará na mensagem "Seu APK foi assinado com vários certificados. Assine apenas com um certificado e faça o upload novamente".
O que eu posso fazer?
Você precisará criar seu aplicativo com um novo ID de aplicativo (por exemplo, alterar de "com.example.myapp" para "com.example.myapp2") e criar uma nova listagem no Google Play.
Possivelmente, você também precisará alterar seu código para que as pessoas possam instalar o novo aplicativo, mesmo que tenham o aplicativo antigo instalado, por exemplo, você precisa garantir que não tenha provedores de conteúdo conflitantes.
Você perderá sua base de instalação existente, revisões etc. e precisará encontrar uma maneira de fazer com que seus clientes existentes desinstale o aplicativo antigo e instale a nova versão.
Novamente, verifique se você possui backups seguros do keystore e das senhas que você usa para esta versão.