bubblewrap icon indicating copy to clipboard operation
bubblewrap copied to clipboard

Error when building from generated keystore file

Open skedwards88 opened this issue 3 months ago • 1 comments

Describe the bug bubble wrap works fine for projects where I already have a signing.keystore file. But when bubblewrap creates a signing.keystore file for me, the subsequent bubblewrap build fails:

cli ERROR Command failed: /Users/xxx/.bubblewrap/android_sdk/build-tools/34.0.0/apksigner sign --ks "/Uk
Failed to load signer "signer #1"
java.io.IOException: Failed to obtain key with alias "my-key-alias" from /Users/xxx/xxx/xxx/W?
	at com.android.apksigner.SignerParams.loadPrivateKeyAndCertsFromKeyStore(SignerParams.java:350)
	at com.android.apksigner.SignerParams.loadPrivateKeyAndCerts(SignerParams.java:202)
	at com.android.apksigner.ApkSignerTool.getSignerConfig(ApkSignerTool.java:438)
	at com.android.apksigner.ApkSignerTool.sign(ApkSignerTool.java:353)
	at com.android.apksigner.ApkSignerTool.main(ApkSignerTool.java:92)
Caused by: java.security.UnrecoverableKeyException: Get Key failed: Given final block not properly padded.
	at java.base/sun.security.pkcs12.PKCS12KeyStore.engineGetKey(PKCS12KeyStore.java:450)
	at java.base/sun.security.util.KeyStoreDelegator.engineGetKey(KeyStoreDelegator.java:91)
	at java.base/java.security.KeyStore.getKey(KeyStore.java:1050)
	at com.android.apksigner.SignerParams.getKeyStoreKey(SignerParams.java:405)
	at com.android.apksigner.SignerParams.loadPrivateKeyAndCertsFromKeyStore(SignerParams.java:318)
	... 4 more
Caused by: javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise.
	at java.base/com.sun.crypto.provider.CipherCore.unpad(CipherCore.java:862)
	at java.base/com.sun.crypto.provider.CipherCore.fillOutputBuffer(CipherCore.java:942)
	at java.base/com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:735)
	at java.base/com.sun.crypto.provider.PBES2Core.engineDoFinal(PBES2Core.java:325)
	at java.base/javax.crypto.Cipher.doFinal(Cipher.java:2205)
	at java.base/sun.security.pkcs12.PKCS12KeyStore.lambda$engineGetKey$0(PKCS12KeyStore.java:371)
	at java.base/sun.security.pkcs12.PKCS12KeyStore$RetryWithZero.run(PKCS12KeyStore.java:257)
	at java.base/sun.security.pkcs12.PKCS12KeyStore.engineGetKey(PKCS12KeyStore.java:361)
	... 8 more

When I run keytool -list -v -keystore "path-to-my-keystore-file", I can see that a key exists with the expected alias.

I have tried 3 times, being careful to use the same passwords for the build step as I did during the init.

To Reproduce Steps to reproduce the behavior:

  1. Run bubblewrap init
  2. When prompted for the "Key store location", give a file location where a file does not already exists
  3. When prompted with "An existing key store could not be found at....Do you want to create one now?", select yes
  4. Run bubblewrap build and input the same key store and key passwords that you entered in the above prompt

Expected behavior Build without error

Desktop (please complete the following information):

skedwards88 avatar Nov 17 '25 16:11 skedwards88

Bate-papo do copiloto

Soluções para erro de descriptografia de alias de chave do ApkSigner

Você disse: cli ERRO Comando falhou: /Users/xxx/.bubblewrap/android_sdk/build-tools/34.0.0/apksigner sign --ks

cli ERRO Comando falhou: /Users/xxx/.bubblewrap/android_sdk/build-tools/34.0.0/apksigner sign --ks "/Uk Falha ao carregar o assinante "assinante #1" java.io.IOException: Falha ao obter a chave com o alias "my-key-alias" de /Users/xxx/xxx/xxx/W? em com.android.apksigner.SignerParams.loadPrivateKeyAndCertsFromKeyStore(SignerParams.java:350) em com.android.apksigner.SignerParams.loadPrivateKeyAndCerts(SignerParams.java:202) em com.android.apksigner.ApkSignerTool.getSignerConfig(ApkSignerTool.java:438) em com.android.apksigner.ApkSignerTool.sign(ApkSignerTool.java:353) em com.android.apksigner.ApkSignerTool.main(ApkSignerTool.java:92) Causado por: java.security.UnrecoverableKeyException: Falha ao obter a chave: Bloco final fornecido não preenchido corretamente. em java.base/sun.security.pkcs12.PKCS12KeyStore.engineGetKey(PKCS12KeyStore.java:450) em java.base/sun.security.util.KeyStoreDelegator.engineGetKey(KeyStoreDelegator.java:91) em java.base/java.security.KeyStore.getKey(KeyStore.java:1050) em com.android.apksigner.SignerParams.getKeyStoreKey(SignerParams.java:405) em com.android.apksigner.SignerParams.loadPrivateKeyAndCertsFromKeyStore(SignerParams.java:318) ... 4 mais Causado por: javax.crypto.BadPaddingException: O bloco final fornecido não foi preenchido corretamente. Esses problemas podem ocorrer. em java.base/com.sun.crypto.provider.CipherCore.unpad(CipherCore.java:862) em java.base/com.sun.crypto.provider.CipherCore.fillOutputBuffer(CipherCore.java:942) em java.base/com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:735) em java.base/com.sun.crypto.provider.PBES2Core.engineDoFinal(PBES2Core.java:325) em java.base/javax.crypto.Cipher.doFinal(Cipher.java:2205) em java.base/sun.security.pkcs12.PKCS12KeyStore.lambda$engineGetKey$0(PKCS12KeyStore.java:371) em java.base/sun.security.pkcs12.PKCS12KeyStore$RetryWithZero.run(PKCS12KeyStore.java:257) em java.base/sun.security.pkcs12.PKCS12KeyStore.engineGetKey(PKCS12KeyStore.java:361) ... 8 mais

Copilot disse: Sua mensagem de erro: ``` java.security.UnrecoverableKeyException: Falha ao obter a chave: Fornecida

Sua mensagem de erro:

Código
java.security.UnrecoverableKeyException: Get Key failed: Given final block not properly padded.
...
Caused by: javax.crypto.BadPaddingException: Given final block not properly padded.

Isso ocorre quando apksigner(chamado pelo Bubblewrap) tenta acessar um alias de chave no seu keystore e não consegue descriptografá-lo corretamente. Isso quase sempre significa:

  1. Senha incorreta : A senha do keystore ou da chave fornecida está incorreta (erro de digitação, senha incorreta, ordem incorreta).
  2. Arquivo Keystore corrompido : O arquivo .keystore ou .jks está corrompido, truncado ou danificado.
  3. Erro de formato do keystore : O arquivo keystore não é um PKCS12 ou JKS como esperado. Por exemplo, foi criado com uma ferramenta/versão diferente.
  4. Formato da senha : Ocasionalmente, caracteres especiais/codificação na senha podem causar problemas. Tente usar uma senha ASCII simples para teste.
  5. Várias chaves/certificados de confiança : Ao usar um keystore PKCS12, às vezes certificados extras estão presentes, o que complica o carregamento.

Como consertar

1. Verifique as senhas duas vezes.

  • A senha foi inserida corretamente no seu script/configuração do Bubblewrap?
  • Se estiver usando senhas diferentes para o keystore e o alias, certifique-se de que ambas estejam corretas e nos campos/ordem corretos.

2. Verifique o keystore

  • Se você tiver o arquivo keystore, execute este comando com o keytool (disponível no Java):
    sh
    keytool -list -v -keystore /path/to/your.keystore
    
    Será solicitada a senha e a lista de aliases.
  • Se a senha falhar aqui, significa que não é a senha correta.

3. Tente regenerar o keystore.

Caso tenha perdido a senha ou não consiga recuperá-la, será necessário criar um novo keystore e assinar com uma nova chave.

Para criar um novo keystore:

sh
keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
  • Use o mesmo pseudônimo, mas defina novas senhas que você conheça.
  • Atualize sua configuração.

4. Verifique o formato do keystore

Se você usou uma versão antiga do Java ou outra ferramenta para criar seu keystore, exporte para um formato PKCS12 moderno:

sh
keytool -importkeystore -srckeystore old.keystore -destkeystore new-keystore.p12 -deststoretype PKCS12

5. Caminho de configuração do Bubblewrap

Observe que seu erro usa /Users/xxx/.bubblewrap/android_sdk/...— mas seu Dockerfile define:

JSON
{ "jdkPath": "/usr/lib/jvm/java-17-openjdk-amd64", "androidSdkPath": "" }

Portanto, dentro do Docker, o caminho do SDK está vazio/conflitante. Certifique-se de que os caminhos dentro do Docker (se estiver usando) e em sua máquina local correspondam ao local do seu keystore e ao local esperado do SDK do Android.

Tabela Resumo

Causa | Solução -- | -- Senha do keystore incorreta | Tente novamente e verifique comkeytool -list Senha de alias de chave incorreta | Tente novamente e verifique usando a mesma ferramenta. Formato incorreto/corrupção | Exportar ou regenerar comkeytool -importkeystore Confusão de caminhos do Docker | Confirme se o keystore está no local correto dentro do contêiner. Vários aliases/certificados | Especifique o alias correto, use um cofre PKCS12 ou JKS simples.

Referências

Avise-me se precisar de ajuda com comandos específicos do keystore ou com a depuração da configuração do Bubblewrap!

er key alias decryption error solutions Bate-papo do copiloto Soluções para erro de descriptografia de alias de chave do ApkSigner [Dockerfile](https://github.com/GoogleChromeLabs/bubblewrap/blob/86493b8bb6a893aab6a7bf6aa0bdd9fb35bbb321/Dockerfile) Você disse: cli ERRO Comando falhou: /Users/xxx/.bubblewrap/android_sdk/build-tools/34.0.0/apksigner sign --ks cli ERRO Comando falhou: /Users/xxx/.bubblewrap/android_sdk/build-tools/34.0.0/apksigner sign --ks "/Uk Falha ao carregar o assinante "assinante #1" java.io.IOException: Falha ao obter a chave com o alias "my-key-alias" de /Users/xxx/xxx/xxx/W? em com.android.apksigner.SignerParams.loadPrivateKeyAndCertsFromKeyStore(SignerParams.java:350) em com.android.apksigner.SignerParams.loadPrivateKeyAndCerts(SignerParams.java:202) em com.android.apksigner.ApkSignerTool.getSignerConfig(ApkSignerTool.java:438) em com.android.apksigner.ApkSignerTool.sign(ApkSignerTool.java:353) em com.android.apksigner.ApkSignerTool.main(ApkSignerTool.java:92) Causado por: java.security.UnrecoverableKeyException: Falha ao obter a chave: Bloco final fornecido não preenchido corretamente. em java.base/sun.security.pkcs12.PKCS12KeyStore.engineGetKey(PKCS12KeyStore.java:450) em java.base/sun.security.util.KeyStoreDelegator.engineGetKey(KeyStoreDelegator.java:91) em java.base/java.security.KeyStore.getKey(KeyStore.java:1050) em com.android.apksigner.SignerParams.getKeyStoreKey(SignerParams.java:405) em com.android.apksigner.SignerParams.loadPrivateKeyAndCertsFromKeyStore(SignerParams.java:318) ... 4 mais Causado por: javax.crypto.BadPaddingException: O bloco final fornecido não foi preenchido corretamente. Esses problemas podem ocorrer. em java.base/com.sun.crypto.provider.CipherCore.unpad(CipherCore.java:862) em java.base/com.sun.crypto.provider.CipherCore.fillOutputBuffer(CipherCore.java:942) em java.base/com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:735) em java.base/com.sun.crypto.provider.PBES2Core.engineDoFinal(PBES2Core.java:325) em java.base/javax.crypto.Cipher.doFinal(Cipher.java:2205) em java.base/sun.security.pkcs12.PKCS12KeyStore.lambda$engineGetKey$0(PKCS12KeyStore.java:371) em java.base/sun.security.pkcs12.PKCS12KeyStore$RetryWithZero.run(PKCS12KeyStore.java:257) em java.base/sun.security.pkcs12.PKCS12KeyStore.engineGetKey(PKCS12KeyStore.java:361) ... 8 mais Copilot disse: Sua mensagem de erro: ``` java.security.UnrecoverableKeyException: Falha ao obter a chave: Fornecida Sua mensagem de erro:

Código java.security.UnrecoverableKeyException: Get Key failed: Given final block not properly padded. ... Caused by: javax.crypto.BadPaddingException: Given final block not properly padded. Isso ocorre quando apksigner(chamado pelo Bubblewrap) tenta acessar um alias de chave no seu keystore e não consegue descriptografá-lo corretamente. Isso quase sempre significa:

Senha incorreta : A senha do keystore ou da chave fornecida está incorreta (erro de digitação, senha incorreta, ordem incorreta). Arquivo Keystore corrompido : O arquivo .keystore ou .jks está corrompido, truncado ou danificado. Erro de formato do keystore : O arquivo keystore não é um PKCS12 ou JKS como esperado. Por exemplo, foi criado com uma ferramenta/versão diferente. Formato da senha : Ocasionalmente, caracteres especiais/codificação na senha podem causar problemas. Tente usar uma senha ASCII simples para teste. Várias chaves/certificados de confiança : Ao usar um keystore PKCS12, às vezes certificados extras estão presentes, o que complica o carregamento. Como consertar

  1. Verifique as senhas duas vezes. A senha foi inserida corretamente no seu script/configuração do Bubblewrap? Se estiver usando senhas diferentes para o keystore e o alias, certifique-se de que ambas estejam corretas e nos campos/ordem corretos.
  2. Verifique o keystore Se você tiver o arquivo keystore, execute este comando com o keytool (disponível no Java): sh keytool -list -v -keystore /path/to/your.keystore Será solicitada a senha e a lista de aliases. Se a senha falhar aqui, significa que não é a senha correta.
  3. Tente regenerar o keystore. Caso tenha perdido a senha ou não consiga recuperá-la, será necessário criar um novo keystore e assinar com uma nova chave.

Para criar um novo keystore:

sh keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000 Use o mesmo pseudônimo, mas defina novas senhas que você conheça. Atualize sua configuração. 4. Verifique o formato do keystore Se você usou uma versão antiga do Java ou outra ferramenta para criar seu keystore, exporte para um formato PKCS12 moderno:

sh keytool -importkeystore -srckeystore old.keystore -destkeystore new-keystore.p12 -deststoretype PKCS12 5. Caminho de configuração do Bubblewrap Observe que seu erro usa /Users/xxx/.bubblewrap/android_sdk/...— mas seu Dockerfile define:

JSON { "jdkPath": "/usr/lib/jvm/java-17-openjdk-amd64", "androidSdkPath": "" } Portanto, dentro do Docker, o caminho do SDK está vazio/conflitante. Certifique-se de que os caminhos dentro do Docker (se estiver usando) e em sua máquina local correspondam ao local do seu keystore e ao local esperado do SDK do Android.

Tabela Resumo Causa Solução Senha do keystore incorreta Tente novamente e verifique comkeytool -list Senha de alias de chave incorreta Tente novamente e verifique usando a mesma ferramenta. Formato incorreto/corrupção Exportar ou regenerar comkeytool -importkeystore Confusão de caminhos do Docker Confirme se o keystore está no local correto dentro do contêiner. Vários aliases/certificados Especifique o alias correto, use um cofre PKCS12 ou JKS simples. Referências Documentação oficial: Assine APKs com o apksigner Não foi possível recuperar a chave do keystore - Stack Overflow Configuração de assinatura da CLI do Bubblewrap Avise-me se precisar de ajuda com comandos específicos do keystore ou com a depuração da configuração do Bubblewrap!

BigodeHR avatar Nov 28 '25 16:11 BigodeHR