apksigner - assinar e verificar APKs do Android
apksigner [options] apk
apksigner --version
apksigner --help
Uma ferramenta de linha de comando para assinar arquivos APK do Android e verificar se as assinaturas de arquivos APK serão verificadas em dispositivos Android.
apk é um arquivo existente para assinar ou verificar.
apksig é um projeto que visa simplificar a assinatura do APK e verificar se as assinaturas do APK devem ser verificadas no Android. O apksig oferece suporte à assinatura JAR (usada pelo Android desde o primeiro dia) e APK Signature Scheme v2 (compatível desde o Android Nougat, API de nível 24).
O principal recurso do apksig é que ele conhece as diferenças na lógica de verificação de assinatura do APK entre diferentes versões da plataforma Android. O apksig pode, portanto, verificar se um APK assinado deve ser verificado em todas as versões da plataforma Android suportadas pelo APK. Ao assinar um APK, o apksig escolherá os algoritmos criptográficos mais apropriados com base nas versões da plataforma Android suportadas pelo APK que está sendo assinado.
sign
Isso assina o APK fornecido, removendo todas as assinaturas pré-existentes. A assinatura é executada usando um ou mais assinantes, cada um representado por um par de chaves assimétricas e um certificado correspondente. Normalmente, um APK é assinado por apenas um signatário. Para cada signatário, você precisa fornecer a chave privada e o certificado do signatário.
verify
Isso verifica se o APK fornecido será verificado no Android. Por padrão, isso verifica se o APK será verificado em todas as versões da plataforma Android compatíveis com o APK (conforme declarado usando minSdkVersion em AndroidManifest.xml). Use --min-sdk-version e/ou --max-sdk-version para verificar o APK em um intervalo personalizado de níveis de API.
lineage
Isso modifica os recursos de um ou mais signatários no SigningCertificateLineage fornecido. Isso pode ser usado para revogar os recursos de um certificado de assinatura anterior assim que a base de instalação for migrada para o novo certificado de assinatura.
rotate
Isso pega as chaves fornecidas e cria uma entrada SigningCertificateLineage vinculando o antigo ao novo, para uso em um cenário de rotação de chaves usando APK Signature Scheme v3.
version
Mostrar o número da versão desta ferramenta e sair
help
Mostrar esta página de uso e sair
Modo de saída detalhado
Mostrar ajuda sobre este comando e sair
Tratar avisos como erros
signAssine o APK fornecido
Arquivo no qual enviar o APK assinado. Por padrão, o APK é assinado no local, substituindo o arquivo de entrada.
Nível de API mais baixo no qual as assinaturas deste APK serão verificadas. Por padrão, o valor de AndroidManifest.xml é usado. Quanto maior o valor, os parâmetros de segurança mais fortes são usados ao assinar.
Nível de API mais alto no qual as assinaturas deste APK serão verificadas. Por padrão, o valor mais alto possível é usado.
Se deve habilitar a assinatura usando o esquema de assinatura JAR (também conhecido como esquema de assinatura v1, aquele usado no Android desde o primeiro dia). Por padrão, a assinatura usando esse esquema é habilitada com base na versão mínima e máxima do SDK (consulte --min-sdk-version e --max-sdk-version).
Se a assinatura deve ser habilitada usando o APK Signature Scheme v2 (também conhecido como esquema de assinatura v2, aquele introduzido no Android Nougat, API de nível 24). Por padrão, a assinatura usando esse esquema é habilitada com base na versão mínima e máxima do SDK (consulte --min-sdk-version e --max-sdk-version).
per-signer optionsEssas opções especificam a configuração de um determinado signatário. Para delimitar opções de signatários diferentes, use --next-signer.
Delimita opções de dois signatários diferentes. Não há necessidade de usar esta opção quando apenas um signatário é usado.
Nome de base para arquivos que compreendem a assinatura do esquema de assinatura JAR (também conhecido como esquema v1) deste signatário. Por padrão, o alias de chave KeyStore ou o nome base do arquivo de chave é usado.
per-signer signing key & certificate optionsHá duas maneiras de fornecer a chave privada e o certificado do signatário: (1) Java KeyStore (consulte --ks) ou (2) arquivo de chave privada no formato PKCS #8 e arquivo de certificado no formato X.509 (consulte --key e --cert).
Carregue a chave privada e a cadeia de certificados do Java KeyStore inicializado a partir do arquivo especificado. NONE significa que nenhum arquivo é necessário para o KeyStore, que é o caso de alguns PKCS #11 KeyStores.
Alias sob o qual a chave privada e o certificado são armazenados no KeyStore. Isso deve ser especificado se o KeyStore contiver várias chaves.
Senha do KeyStore (consulte --ks). Os seguintes formatos são suportados:
pass: senha fornecida em linha
env: senha fornecida na variável de ambiente nomeada
arquivo: senha fornecida no arquivo nomeado, como uma única linha
senha stdin fornecida na entrada padrão, como uma única linha
Uma senha é necessária para abrir um KeyStore. Por padrão, a ferramenta solicitará a senha via console ou entrada padrão. Quando o mesmo arquivo (incluindo a entrada padrão) é usado para fornecer várias senhas, as senhas são lidas do arquivo uma linha por vez. As senhas são lidas na ordem em que os signatários são especificados e, dentro de cada signatário, a senha do KeyStore é lida antes que a senha da chave seja lida.
Senha com a qual a chave privada é protegida. Por padrão, assume-se que as chaves do KeyStore são protegidas usando a mesma senha do KeyStore (consulte --ks-pass). Os seguintes formatos são suportados:
pass: senha fornecida em linha
env: senha fornecida na variável de ambiente nomeada
arquivo: senha fornecida no arquivo nomeado, como uma única linha stdin senha fornecida na entrada padrão, como uma única linha
Por padrão, se a chave for protegida por senha, a ferramenta solicitará a senha por meio do console ou da entrada padrão. Quando o mesmo arquivo (incluindo a entrada padrão) é usado para fornecer várias senhas, as senhas são lidas do arquivo uma linha por vez. As senhas são lidas na ordem em que os signatários são especificados e, dentro de cada signatário, a senha do KeyStore é lida antes que a senha da chave seja lida.
Codificação de caracteres adicionais (por exemplo, ibm437 ou utf-8) para tentar senhas contendo caracteres não ASCII. KeyStores criados por keytool geralmente são criptografados não usando a forma Unicode da senha, mas usando a forma produzida pela codificação da senha usando a codificação de caracteres do console. Por padrão, o apksigner tenta descriptografar usando várias formas de senha: o formulário Unicode, o formulário codificado usando o conjunto de caracteres padrão da JVM e, no Java 8 e anteriores, o formulário codificado usando o conjunto de caracteres do console. No Java 9, o apksigner não consegue detectar o conjunto de caracteres do console e pode precisar receber --pass-encoding quando uma senha não ASCII é usada. --pass-encoding também pode precisar ser fornecido para um KeyStore criado por keytool em um sistema operacional diferente ou em uma localidade diferente.
Tipo/algoritmo do KeyStore a ser usado. Por padrão, o tipo padrão é usado.
Nome do Provedor JCA do qual solicitar a implementação do KeyStore. Por padrão, o provedor de prioridade mais alta é usado. Consulte --ks-provider-class para obter uma maneira alternativa de especificar um provedor.
Nome de classe totalmente qualificado do Provedor JCA do qual solicitar a implementação do KeyStore. Por padrão, o provedor é escolhido com base em --ks-provider-name.
Valor a ser passado para o construtor da classe JCA Provider especificada por --ks-provider-class. O valor é passado para o construtor como java.lang.String. Por padrão, o construtor do provedor no-arg é usado.
Carrega a chave privada do arquivo especificado. Se a chave for protegida por senha, a senha será solicitada via entrada padrão, a menos que especificado de outra forma usando --key-pass. O arquivo deve estar no formato PKCS #8 DER.
Carregue a cadeia de certificados do arquivo especificado. O arquivo deve estar no formato X.509 PEM ou DER.
verifyVerifique se o APK fornecido deve ser verificado no Android
Mostrar informações sobre os certificados de assinatura do APK
Nível de API mais baixo no qual as assinaturas deste APK serão verificadas. Por padrão, o valor de AndroidManifest.xml é usado.
Nível de API mais alto no qual as assinaturas deste APK serão verificadas. Por padrão, o valor mais alto possível é usado.
apksigner sign --ks release.jks app.apk apksigner verify --verbose app.apk apksigner lineage --in /path/to/existing/lineage --print-certs -v apksigner rotate --out /path/to/new/file --old-signer --ks release.jks --new-signer --ks release2.jks
signAssine um APK usando a única chave em keystore release.jks:
apksigner sign --ks release.jks app.apk
Assine um APK usando uma chave privada e um certificado armazenado como arquivos individuais:
apksigner sign --key release.pk8 --cert release.x509.pem app.apk
Assine um APK usando duas chaves:
apksigner sign --ks release.jks --next-signer --ks magic.jks app.apk
verifyVerifique se as assinaturas do APK devem ser verificadas em todas as plataformas Android declaradas como suportadas por este APK:
apksigner verify app.apk
Verifique se as assinaturas do APK devem ser verificadas em plataformas Android com API de nível 15 e superior:
apksigner verify --min-sdk-version 15 app.apk
lineageRemova todos os recursos de um signatário anterior na linhagem:
apksigner lineage --in /path/to/existing/lineage --out /path/to/new/file --signer --ks release.jks --set-installed-data false --set-shared-uid false --set-permission false --set-rollback false --set-auth false
Exibir detalhes sobre os certificados de assinatura e seus recursos na linhagem:
apksigner lineage --in /path/to/existing/lineage --print-certs -v
rotateCrie um novo SigningCertificateLineage para habilitar a rotação:
apksigner rotate --out /path/to/new/file --old-signer --ks release.jks --new-signer --ks release2.jks
Estenda um SigningCertificateLineage existente para girar novamente após a rotação anterior:
apksigner rotate --in /path/to/existing/lineage --out /path/to/new/file --old-signer --ks release2.jks --new-signer --ks release3.jks
Crie um novo SigningCertificateLineage com recursos explícitos para o signatário anterior:
apksigner rotate --out /path/to/new/file --old-signer --ks release.jks --set-installed-data true --set-shared-uid true --set-permission true --set-rollback false --set-auth true --new-signer --ks release2.jks
signapk(1) jar(1) zip(1) zipalign(1)
https://source.android.com/devices/tech/ota/sign_builds.html
O projeto de código aberto do Android.