Como descubro qual keystore foi usado para assinar um aplicativo?

260

Eu tenho um aplicativo assinado e vários arquivos de armazenamento de chaves. Gostaria de atualizar o aplicativo, então preciso descobrir qual das chaves foi usada.

Como posso comparar qual keystore foi usado para assinar originalmente meu aplicativo com vários keystores que tenho na minha máquina?

xliiv
fonte
Eu não tenho idéia, você pode encontrá-lo ou não, mas se você assinar um aplicativo com a chave errada, o console do desenvolvedor (onde você publica os aplicativos) dirá que está errado. Você pode experimentar todos eles.
logcat
Existe uma chave pública 'console do desenvolvedor'> 'Editar perfil'. Posso usá-lo de qualquer maneira para me ajudar?
xliiv
como recriar o arquivo keystore se ele foi excluído acidentalmente?
Mavenツ
@ Maveň ツ você não pode. Se você perder seu keystore, estará brindando. O Google introduziu [App Signing], onde eles mantêm as informações de assinatura. [Assinatura do aplicativo]: support.google.com/googleplay/android-developer/answer/…
mir

Respostas:

402

Primeiro, descompacte o APK e extraia o arquivo /META-INF/ANDROID_.RSA (esse arquivo também pode ser CERT.RSA, mas deve haver apenas um arquivo .RSA).

Em seguida, emita este comando:

keytool -printcert -file ANDROID_.RSA

Você receberá impressões digitais de certificado como este:

     MD5:  B3:4F:BE:07:AA:78:24:DC:CA:92:36:FF:AE:8C:17:DB
     SHA1: 16:59:E7:E3:0C:AA:7A:0D:F2:0D:05:20:12:A8:85:0B:32:C5:4F:68
     Signature algorithm name: SHA1withRSA

Em seguida, use o keytool novamente para imprimir todos os aliases do seu keystore de assinatura:

keytool -list -keystore my-signing-key.keystore

Você obterá uma lista de aliases e suas impressões digitais de certificado:

android_key, Jan 23, 2010, PrivateKeyEntry,
Certificate fingerprint (MD5): B3:4F:BE:07:AA:78:24:DC:CA:92:36:FF:AE:8C:17:DB

Voila! agora podemos determinar que o apk foi assinado com este keystore e com o alias 'android_key'.

O Keytool faz parte do Java, portanto, verifique se o PATH possui o diretório de instalação do Java.

azgolfer
fonte
1
Obrigado por isso. Eu adicionei uma ferramenta para fazer isso no meu projeto do github. github.com/RichardBronosky/ota-tools/blob/master/…
Bruno Bronosky
Oi eu não entendo este comando ~ keytool -list -keystore meu-assinatura-key.keystore, qual é meu-assinatura-key.keystore
Thoman
2
@Thoman meu-assinatura-key.keystore é o nome do arquivo de armazenamento de chaves que contém as chaves que são usados para assinar o apk
1800 INFORMATION
Muito obrigado por isso! Nosso aplicativo foi assinado novamente pela PlayStore e causa falha no login do Google. Eu tive que baixar o APK diretamente do PlayStore e encontrar o SHA1 real para registrá-lo no console do Google Cloud.
Alvin Rusli
335

Você pode usar a Ferramenta de gerenciamento de chaves e certificados do Java 7 keytoolpara verificar a assinatura de um keystore ou um APK sem extrair nenhum arquivo.

Assinatura de um APK

keytool -printcert -jarfile app.apk

A saída revelará o proprietário / emissor da assinatura e as impressões digitais MD5, SHA1 e SHA256 do arquivo APK app.apk.

(Observe que o -jarfileargumento foi introduzido no Java 7; consulte a documentação para obter mais detalhes.)

Assinatura de um keystore

keytool -list -v -keystore release.jks

A saída revelará os aliases (entradas) no arquivo keystore release.jks, com as impressões digitais do certificado (MD5, SHA1 e SHA256).

Se as impressões digitais SHA1 entre o APK e o keystore corresponderem, você pode ter certeza de que o aplicativo foi assinado com a chave.

Paul Lammertsma
fonte
1
@goRGon Você está usando o Java 7 ou posterior?
Paul Lammertsma
2
@goRGon De fato, o -jarfileargumento foi introduzido no Java 7. Atualizei a resposta.
Paul Lammertsma
41
Esta deve ser uma resposta aceita. Não é necessário descompactar o
código
1
É estranho que o Java 1.6 ainda seja enviado por padrão no Mac. Eu recomendo atualizar para uma versão mais recente.
Paul Lammertsma
2
@RichardBronosky Isso não é verdade. Sou desenvolvedor do Android há mais de três anos sem fazer o desenvolvimento do iOS. No entanto, concordo com o seu ponto principal por diferentes razões. O Java 1.6 parece ser a versão mais estendida até agora, ou pelo menos generalizada, e, embora a solução aceita funcione com o 1.6 e o ​​1.7, este funcionará apenas com o 1.7, então não acho que essa seja a resposta aceita ( ainda!). (Note também que a resposta aceita é formulário 2012, enquanto esta é a partir de abril de 2014)
Fran Marzoa
17

Para desenvolver a resposta de Paul Lammertsma, este comando imprimirá os nomes e assinaturas de todos os APKs no diretório atual (estou usando sh porque mais tarde preciso canalizar a saída para grep):

find . -name "*.apk" -exec echo "APK: {}" \; -exec sh -c 'keytool -printcert -jarfile "{}"' \;

Saída de amostra:

APK: ./com.google.android.youtube-10.39.54-107954130-minAPI15.apk
Signer #1:

Signature:

Owner: CN=Unknown, OU="Google, Inc", O="Google, Inc", L=Mountain View, ST=CA, C=US
Issuer: CN=Unknown, OU="Google, Inc", O="Google, Inc", L=Mountain View, ST=CA, C=US
Serial number: 4934987e
Valid from: Mon Dec 01 18:07:58 PST 2008 until: Fri Apr 18 19:07:58 PDT 2036
Certificate fingerprints:
         MD5:  D0:46:FC:5D:1F:C3:CD:0E:57:C5:44:40:97:CD:54:49
         SHA1: 24:BB:24:C0:5E:47:E0:AE:FA:68:A5:8A:76:61:79:D9:B6:13:A6:00
         SHA256: 3D:7A:12:23:01:9A:A3:9D:9E:A0:E3:43:6A:B7:C0:89:6B:FB:4F:B6:79:F4:DE:5F:E7:C2:3F:32:6C:8F:99:4A
         Signature algorithm name: MD5withRSA
         Version: 1

APK: ./com.google.android.youtube_10.40.56-108056134_minAPI15_maxAPI22(armeabi-v7a)(480dpi).apk
Signer #1:

Signature:

Owner: CN=Unknown, OU="Google, Inc", O="Google, Inc", L=Mountain View, ST=CA, C=US
Issuer: CN=Unknown, OU="Google, Inc", O="Google, Inc", L=Mountain View, ST=CA, C=US
Serial number: 4934987e
Valid from: Mon Dec 01 18:07:58 PST 2008 until: Fri Apr 18 19:07:58 PDT 2036
Certificate fingerprints:
         MD5:  D0:46:FC:5D:1F:C3:CD:0E:57:C5:44:40:97:CD:54:49
         SHA1: 24:BB:24:C0:5E:47:E0:AE:FA:68:A5:8A:76:61:79:D9:B6:13:A6:00
         SHA256: 3D:7A:12:23:01:9A:A3:9D:9E:A0:E3:43:6A:B7:C0:89:6B:FB:4F:B6:79:F4:DE:5F:E7:C2:3F:32:6C:8F:99:4A
         Signature algorithm name: MD5withRSA
         Version: 1

Ou se você se importa apenas com o SHA1:

find . -name "*.apk" -exec echo "APK: {}" \; -exec sh -c 'keytool -printcert -jarfile "{}" | grep SHA1' \;

Saída de amostra:

APK: ./com.google.android.youtube-10.39.54-107954130-minAPI15.apk
         SHA1: 24:BB:24:C0:5E:47:E0:AE:FA:68:A5:8A:76:61:79:D9:B6:13:A6:00
APK: ./com.google.android.youtube_10.40.56-108056134_minAPI15_maxAPI22(armeabi-v7a)(480dpi).apk
         SHA1: 24:BB:24:C0:5E:47:E0:AE:FA:68:A5:8A:76:61:79:D9:B6:13:A6:00
Artem Russakovskii
fonte
Interessante! Usei uma abordagem muito semelhante em uma validação em nosso armazenamento de distribuição hospedado em particular para informar ao usuário que o aplicativo não foi assinado corretamente. Também tomo nota especial para observar se o alias da chave é "androiddebugkey" para exibir uma mensagem com palavras diferentes. Acho que o Google Play faz a validação da mesma maneira. Suponho que você esteja usando isso para validar APKs no APKMirror?
Paul Lammertsma
@PaulLammertsma Sim, nós somos.
Artem Russakovskii
11

Maneira muito mais fácil de visualizar o certificado de assinatura:

jarsigner.exe -verbose -verify -certs myapk.apk

Isso mostrará apenas o DN; portanto, se você tiver dois certificados com o mesmo DN, poderá ser necessário comparar por impressão digital.

Nikolay Elenkov
fonte
O que é DN? Principalmente, tenho muitas linhas como esta: X.509, CN = {nome e sobrenome} [o certificado é válido de {data de} a {data_a}] #
xliiv
DN significa 'Nome Distinto', no seu caso, é a parte 'CN = {nome e sobrenome}'.
Nikolay Elenkov
6

Existem muitos freewares para examinar os certificados e armazenamentos de chaves, como o KeyStore Explorer .

Descompacte o apk e abra o arquivo META-INF / ?. RSA. ? deve ser CERT ou ANDROID ou pode ser outra coisa. Ele exibirá todas as informações associadas ao seu apk.

Hanif
fonte
4

Você pode fazer isso com a apksignerferramenta que faz parte do SDK do Android:

apksigner verify --print-certs my_app.apk

Você pode encontrar o apksigner dentro do diretório build-tools. Por exemplo: ~/Library/Android/sdk/build-tools/29.0.1/apksigner

Nic Dahlquist
fonte