Como assinar um pacote de aplicativo usando o SignTool

Observação

Para assinar um pacote de aplicativo do Windows, consulte Assinar um pacote de aplicativo usando SignTool.

Saiba como usar o SignTool para assinar seus pacotes de aplicativos do Windows para que eles possam ser implantados. SignTool faz parte do Windows Software Development Kit (SDK).

Todos os pacotes de aplicativos do Windows devem ser assinados digitalmente antes de poderem ser implantados. Embora o Microsoft Visual Studio 2012 e posterior possa assinar um pacote de aplicativo durante sua criação, os pacotes criados usando a ferramenta de empacotador de aplicativos (MakeAppx.exe) do SDK do Windows não são assinados.

Observação

Você só pode usar o SignTool para assinar seus pacotes de aplicativos do Windows no Windows 8 e posterior ou no Windows Server 2012 e posterior. Você não pode usar o SignTool para assinar pacotes de aplicativos em sistemas operacionais de nível inferior, como o Windows 7 ou o Windows Server 2008 R2.

O que você precisa saber

Tecnologias

Pré-requisitos

  • SignTool, que faz parte do SDK do Windows

  • Um certificado de assinatura de código válido, por exemplo, um arquivo de troca de informações pessoais (.pfx) criado com as ferramentas MakeCert.exe e Pvk2Pfx.exe

    Para obter informações sobre como criar um certificado de assinatura de código válido, consulte Como criar um certificado de assinatura de pacote de aplicativo.

  • Um aplicativo do Windows empacotado, por exemplo, um arquivo .appx criado usando a ferramenta do empacotador de aplicativos (MakeAppx.exe)

Considerações adicionais

O certificado que você usa para assinar o pacote do aplicativo deve atender a estes critérios:

  • O nome da entidade do certificado deve corresponder ao atributo Publisher contido no elemento Identity do arquivo AppxManifest.xml armazenado no pacote. O nome do editor faz parte da identidade de um aplicativo do Windows empacotado, portanto, você precisa fazer com que o nome da entidade do certificado corresponda ao nome do editor do aplicativo. Isso permite que a identidade dos pacotes assinados seja verificada em relação à assinatura digital. Para obter informações sobre erros de assinatura que podem surgir ao assinar um pacote de aplicativo usando o SignTool, consulte a seção Comentários de Como criar um certificado de assinatura de pacote de aplicativo.

  • O certificado deve ser válido para assinatura de código. Isso significa que ambos os itens devem ser verdadeiros:

    • O campo Uso Estendido de Chave (EKU) do certificado deve ser desdefinido ou conter o valor EKU para assinatura de código (1.3.6.1.5.5.7.3.3).
    • O campo Uso da Chave (KU) do certificado deve estar desconfigurado ou conter o bit de uso para assinatura digital (0x80).
  • O certificado contém uma chave privada.

  • O certificado é válido. Ele está ativo, não expirou e não foi revogado.

Instruções

Etapa 1: Determinar o algoritmo de hash a ser usado

Ao assinar o pacote do aplicativo, você deve usar o mesmo algoritmo de hash usado quando criou o pacote do aplicativo. Se você usou as configurações padrão para criar o pacote do aplicativo, o algoritmo de hash usado será SHA256.

Se você usou o empacotador de aplicativos com um algoritmo de hash específico para criar o pacote do aplicativo, use o mesmo algoritmo para assinar o pacote. Para determinar o algoritmo de hash a ser usado para assinar um pacote, você pode extrair o conteúdo do pacote e inspecionar o arquivo AppxBlockMap.xml. O atributo HashMethod do elemento BlockMap indica o algoritmo de hash que foi usado ao criar o pacote do aplicativo. Por exemplo:

<BlockMap xmlns="http://schemas.microsoft.com/appx/2010/blockmap" 
HashMethod="https://www.w3.org/2001/04/xmlenc#sha256">

O elemento BlockMap anterior indica que o algoritmo SHA256 foi usado. Esta tabela lista o mapeamento dos algoritmos atualmente disponíveis:

Valor de HashMethod hashAlgorithm a ser usado
https://www.w3.org/2001/04/xmlenc#sha256 SHA256 (.appx padrão)
https://www.w3.org/2001/04/xmldsig-more#sha384 SHA384
https://www.w3.org/2001/04/xmlenc#sha512 SHA512

Etapa 2: Executar SignTool.exe para assinar o pacote

Para assinar o pacote com um certificado de assinatura de um arquivo .pfx

  • SignTool sign /fd hashAlgorithm /a /f signingCert.pfx /p password filepath.appx
    

SignTool padroniza o parâmetro hashAlgorithm /fd para SHA1 se ele não for especificado e SHA1 não for válido para assinar pacotes de aplicativos. Portanto, você deve especificar esse parâmetro ao assinar um pacote de aplicativo. Para assinar um pacote de aplicativo que foi criado com o hash SHA256 padrão, especifique o parâmetro hashAlgorithm /fd como SHA256:

SignTool sign /fd SHA256 /a /f signingCert.pfx /p password filepath.appx

Você pode omitir o parâmetro de senha /p se usar um arquivo .pfx que não esteja protegido por senha . Você também pode usar outras opções de seleção de certificado que são suportadas pela SignTool para assinar pacotes de aplicativos. Para obter mais informações sobre essas opções, consulte SignTool.

Observação

Você não pode usar a operação de carimbo de data/hora SignTool em um pacote de aplicativo assinado, a operação não é suportada.

Se você quiser marcar o tempo do pacote do aplicativo, deverá fazê-lo durante a operação de assinatura. Por exemplo:

SignTool sign /fd hashAlgorithm /a /f signingCert.pfx /p password /tr timestampServerUrl 
filepath.appx

Torne o parâmetro /tr timestampServerUrl igual à URL de um servidor de carimbo de data/hora RFC 3161.

Comentários

Esta seção discute a solução de problemas de erros de assinatura para pacotes de aplicativos.

Solução de problemas de erros de assinatura de pacote de aplicativo

Além dos erros de assinatura que o SignTool pode retornar, o SignTool também pode retornar erros específicos para a assinatura de pacotes de aplicativos. Esses erros geralmente aparecem como erros internos:

SignTool Error: An unexpected internal error has occurred.
Error information: "Error: SignerSign() failed." (-2147024885 / 0x8007000B) 

Se o código de erro começar com 0x8008, como 0x80080206 APPX_E_CORRUPT_CONTENT), ele indica que o pacote que está sendo assinado é inválido. Nesse caso, antes de assinar o pacote, você deve recompilá-lo. Para obter a lista completa de erros 0x8008*, consulte Códigos de erro COM (segurança e configuração).

Mais comumente, o erro é 0x8007000b (ERROR_BAD_FORMAT). Nesse caso, você pode encontrar informações de erro mais específicas no log de eventos:

Para pesquisar o log de eventos

  1. Execute Eventvwr.msc.
  2. Abra o log de eventos: Logs de aplicativos e serviços do Visualizador de Eventos > (Local) > Microsoft Windows AppxPackagingOM > Microsoft-Windows-AppxPackaging >>/Operacional
  3. Procure o evento de erro mais recente.

O erro interno geralmente corresponde a um destes:

ID do evento Exemplo de cadeia de caracteres de evento Sugestão
150 0x8007000B de erro: O nome do editor do manifesto do aplicativo (CN=Contoso) deve corresponder ao nome da entidade do certificado de assinatura (CN=Contoso, C=US). O nome do editor do manifesto do aplicativo deve corresponder exatamente ao nome da entidade da assinatura. Nota: Esses nomes são especificados entre aspas e diferenciam maiúsculas de minúsculas e espaços em branco.
Você pode atualizar a cadeia de caracteres de atributo Publisher definida para o elemento Identity no arquivo AppxManifest.xml para corresponder ao nome da entidade do certificado de assinatura pretendido. Ou selecione um certificado de assinatura diferente com um nome de entidade que corresponda ao nome do editor do manifesto do aplicativo. O nome do editor do manifesto e o nome da entidade do certificado estão listados na mensagem do evento.
151 0x8007000B de erro: O método de hash de assinatura especificado (SHA512) deve corresponder ao método de hash usado no mapa de bloco de pacote do aplicativo (SHA256). O hashAlgorithm especificado no parâmetro /fd está incorreto (consulte Etapa 1: Determinar o algoritmo de hash a ser usado). Execute novamente SignTool com o hashAlgorithm que corresponde ao mapa de blocos do pacote do aplicativo.
152 0x8007000B de erro: O conteúdo do pacote do aplicativo deve ser validado em relação ao seu mapa de blocos. O pacote do aplicativo está corrompido e precisa ser reconstruído para gerar um novo mapa de blocos. Para obter mais informações sobre como criar um pacote de aplicativo, consulte Criando um pacote de aplicativo com o empacotador de aplicativos ou Criando um pacote de aplicativo com o Visual Studio 2012.

Considerações sobre segurança

Depois que o pacote for assinado, o certificado usado para assinar o pacote ainda deverá ser confiável pelo computador no qual o pacote será implantado. Ao adicionar um certificado aos armazenamentos de certificados do computador local, você afeta a confiança no certificado de todos os usuários no computador. Recomendamos que você instale todos os certificados de assinatura de código desejados para testar pacotes de aplicativos no repositório de certificados Pessoas Confiáveis e remova imediatamente esses certificados quando não for mais necessário. Se você criar seus próprios certificados de teste para assinar pacotes de aplicativos, também recomendamos restringir os privilégios associados ao certificado de teste. Para obter mais informações sobre como criar certificados de teste para assinar pacotes de aplicativos, consulte Como criar um certificado de assinatura de pacote de aplicativo.

Amostras

Criar exemplo de pacote de aplicativo

Conceitos

Práticas recomendadas de assinatura de código

Assinando um pacote no Visual Studio 2012

SignTool

Empacotador de aplicativo (MakeAppx.exe)

Como criar um certificado de assinatura de pacote de aplicativos