Error when building from generated keystore file
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:
- Run
bubblewrap init - When prompted for the "Key store location", give a file location where a file does not already exists
- When prompted with "An existing key store could not be found at....Do you want to create one now?", select yes
- Run
bubblewrap buildand 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):
- MacOS 15.5 (24F74), Apple M4
- @bubblewrap/[email protected]
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
- 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.
- 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.
- 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!