O apk deve ser assinado com os mesmos certificados da versão anterior

200

Eu havia carregado meu aplicativo no Google Play (quando era chamado de Android Market) há algum tempo.

Hoje atualizei o aplicativo, mas excluí o keystore anterior e criei um novo.
Ao fazer o upload, ele diz que o APK deve ser assinado com os mesmos certificados da versão anterior:

Falha no upload

Você enviou um APK assinado com um certificado diferente para os APKs anteriores. Você deve usar o mesmo certificado.

Seus APKs existentes são assinados com os certificados com impressões digitais:
[SHA1: 89: 2F: 11: FE: CE: D6: CC: DF: 65: E7: 76: 3E: DD: A7: 96: 4F: 84: DD: BA: 33]
e os certificados usados ​​para assinar o APK que você enviou têm impressões digitais:
[SHA1: 20: 26: F4: C1: DF: 0F: 2B: D9: 46: 03: FF: AB: 07: B1: 28: 7B: 9C: 75: 44: CC]

Mas não tenho esse certificado e não quero excluir e republicar o aplicativo, porque ele possui usuários ativos.

O que posso fazer para assinar meu aplicativo com novo certificado?

artem
fonte
26
Estou tendo um problema diferente: tentei atualizar um aplicativo, mas ele continua dizendo esse erro. O fato é que nunca mudei o keystore !!! O que eu posso fazer?!?
Mariux 27/11
como você resolveu ??
Elizabeth
@ int_32 como você resolve isso ??
Amit Sharma 14/01

Respostas:

187

Nada. Leia a documentação: Publicando atualizações no Android Market

Antes de fazer upload do aplicativo atualizado, certifique-se de incrementar os atributos android: versionCode e android: versionName no elemento do arquivo de manifesto. Além disso, o nome do pacote deve ser o mesmo e o .apk deve ser assinado com a mesma chave privada. Se o nome do pacote e o certificado de assinatura não corresponderem aos da versão existente, o Market o considerará um novo aplicativo e não o oferecerá aos usuários como uma atualização.

Rubycon
fonte
14
Ótima resposta. Eu nunca percebi que, se a chave for perdida, o aplicativo não poderá ser atualizado. Lembre-se de fazer backup da chave em local seguro.
precisa saber é o seguinte
18
O que eu faria normalmente é armazenar o arquivo keystore no svn. Coloque uma nova pasta chamada credencial, juntamente com trunk / tag / branches e armazene o arquivo de armazenamento de chaves lá. Adicione também um novo arquivo .txt indicando o arquivo keystore. O keystore é tão importante quanto o código-fonte . Uma vez que você perdeu (ou esqueceu a senha) você está ferrado ..
Krishnabhadra
42
Por favor, NÃO verificar a sua senha de armazenamento de chaves (ou qualquer senha para que o assunto) no controle de origem, como diz @Krishnabhadra. Mantenha o keystore e a senha separados e a senha segura.
Christopher Orr
1
O que?! Mas ele me disse que minha chave era muito antiga, então eu a apaguei e criei uma nova agora que entendi !?
2
@iwayneo O sistema de compilação pode ter lhe dito que sua chave de depuração era muito antiga, mas é muito improvável que isso tenha acontecido com uma chave de lançamento , já que o Google Play deve rejeitar chaves que expiram antes de outubro de 2033 .
Christopher Orr
127

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 keytoolcomando não funcionar (a -jarfileopção requer Java 7), você pode obter informações mais básicas através do jarsignercomando:

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.

Christopher Orr
fonte
Eu tentei o comando que você deu para verificar a depuração (que eu estava procurando), mas ele retorna um erro de que o jar contém assinaturas que não incluem um carimbo de data / hora. Eu criei meu apk usando este segmento: stackoverflow.com/questions/16622843/…
CularBytes
@RageCompex Você não obtém saída e apenas um erro? Quando executo esse comando, também recebo um aviso de carimbo de data / hora (não é um erro). Contanto que você obtenha a saída X.509, isso é tudo que você precisa.
Christopher Orr
Sim, eu recebo a saída X.509, então não é um problema, eu acho? Que tal [CertPath not validated: Path does not chain with any of the trust anchors], não é um problema? Eu vejo meu nome na posição CN, então acho que assinou adequadamente, ele :)
CularBytes
@RageCompex Isso já foi respondido na seção "Verifique as chaves de assinatura usadas".
Christopher Orr
Eu tive um mini ataque cardíaco hoje. Eu usei essas linhas de comando para descobrir o Keystore oculto. Valeu mesmo, cara! Você me salvou ... Realmente: D
Ajeet
11

Nada - o Google diz claramente que o aplicativo é identificado pelas chaves usadas para assiná-lo. Conseqüentemente, se você perdeu as chaves, precisará criar um novo aplicativo.

Callback de Eugene Mayevski
fonte
1
@sports Eles fazem avisá-lo. Observe a grande mensagem de aviso vermelha : developer.android.com/tools/publishing/…
Christopher Orr
2
@sports De qualquer forma, você pode publicar mais de um aplicativo na mesma conta de desenvolvedor, para não precisar pagar novamente.
Christopher Orr
7

Hoje eu enfrentei o mesmo problema, infelizmente, eu estava tendo dois apelidos no meu arquivo keystore.insira a descrição da imagem aqui

Krishan
fonte
7

Acabei de fazer isso acontecer do nada. Eu realmente não acho que mudei nada.

No entanto, Build => Clean Projectconsertou.

Dave Hubbard
fonte
1
Hmm, passei uma semana, fiz todo o possível. e é hora de dizer "WTF", mas é a única coisa que ajudou. (Também tentei invalidar caches que não ajudaram ..) Obrigado
Upsilon42
1
Isso corrigiu o problema depois de ir louco por uma hora
Boris Legovic
Obrigado por isso; É um salva-vidas da vida real!
Ian Mbae 5/08/19
Não vejo isso relacionado.
Infinite Loops
Muito obrigado!. Gerei acidentalmente um apk assinado com diferentes arquivos e credenciais de keystore e o carreguei. Manteve o mesmo erro mesmo após o upload do apk com o keystore correto. Após uma hora de criação de novos lançamentos com cache inválido, o Android Studio e o PC são reiniciados, isso finalmente foi corrigido.
Arun
5

Aqui eu recebo a resposta para essa pergunta. Depois de procurar por muito tempo, finalmente eu consegui decifrar a chave e a senha para isso. Eu esqueço minha chave e alias também o arquivo jks, mas felizmente eu sei o monte de senha que eu coloquei nele. mas encontrar combinações corretas para essa foi a tarefa mais difícil para mim.

Solução - Faça o download - Plug-in Keytool IUI versão 2.4.1 insira a descrição da imagem aqui

a janela irá aparecer agora, mostrando o nome alternativo ..se o arquivo jks estiver correto .. clique com o botão direito do mouse no alias e clique em "ver cadeia de certificados" .. mostrará a chave SHA1 .. combine essa chave com a chave que você obtiver enquanto você carregava o apk na google app store ...

se corresponder, você estará com o arquivo jks e o alias corretos ..

agora sorte eu tenho monte de senha para combinar .. insira a descrição da imagem aqui

agora vá para este scrren coloque o mesmo caminho jks .. e a senha (entre a senha que você possui) coloque qualquer caminho no "arquivo de certificado"

se a tela mostrar algum erro, a senha não será correspondente. se não mostrar nenhum erro, significa que você está com o arquivo jks correto. alias e senha corretos () agora com isso você pode enviar seu apk na play store :)

Arun Yadav
fonte
você perdeu a chave privada e conseguiu recuperá-la dessa maneira? Se a resposta for sim, é possível vincular onde baixar a ferramenta? E como faço para abrir o aplicativo?
LS_
4

Se você tiver um arquivo apk anterior com você (backup), use o jarSigner para extrair o certificado daquele apk, use essa chave ou use keytool para clonar esse certificado, pois isso pode ajudar ... Links úteis são documentos do jarsigner e documentos do keytools .

om252345
fonte
5
"..use jarSigner para extrair certificado desse apk" - Diga-nos como fazer isso?
Rubycon 30/01
14
Isso não recuperará a chave privada necessária para assinar o apk novamente.
botteaap
Apk deve ser assinado com mesma chave privada
om252345
3

Eu recomendo o Keystore Explorer ( https://keystore-explorer.org/ ), que permite acessar seu keystore sem precisar carregá-lo no Google Play. Dessa forma, você pode solucionar se está digitando sua senha incorretamente.

drdiv
fonte
1

Você pode usar o novo recurso de assinatura do aplicativo Google play para gerar um novo arquivo de chave.

Depois de maio de 2017, a Google Play Store adiciona um novo recurso à Play Store e às Boas Notícias para Desenvolvedores Android. Com esse recurso, o desenvolvedor pode atualizar seu aplicativo ou Apk que perderam um arquivo do KeyStore. você precisa ativar a assinatura do aplicativo Google Play no console da 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
fonte
0

Eu enfrentei esse problema recentemente, depois de tentar maneiras diferentes de fazer login, como ativar a V1 ou V2, fazer login alterando o nome do alias e a última vez que soube que estou usando o arquivo de armazenamento de chaves errado

user2837615
fonte
0

Meu erro [bobo] foi que eu usei o arquivo app-debug.apk em vez do arquivo app-release.apk. Você precisa escolher "release" no quadro "Build Variants" ao gerar APK assinado. O arquivo app-release.apk deve estar localizado na pasta "app \ release" na raiz do seu projeto.

M. Marmor
fonte