Como assinar um pacote do aplicativo usando a SignTool
Observação
Para assinar um pacote de aplicativo Windows, consulte Assinar um pacote de aplicativo usando SignTool.
Saiba como usar o SignTool para assinar seus pacotes de aplicativos Windows para que eles possam ser implantados. SignTool faz parte do Windows Software Development Kit (SDK).
Todos os pacotes de aplicativos Windows devem ser assinados digitalmente antes de serem implantados. Embora Microsoft Visual Studio 2012 e posteriores possam assinar um pacote de aplicativo durante sua criação, os pacotes que você cria usando a ferramenta de empacotador de aplicativos (MakeAppx.exe) do SDK do Windows não estão assinados.
Observação
Você só pode usar o SignTool para assinar seus pacotes de aplicativos Windows no Windows 8 e posterior ou 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 Windows 7 ou Windows Server 2008 R2.
O que você precisa saber
Tecnologias
- Introdução à Assinatura de Código
- Pacotes de aplicativos e implantação
- Ferramentas para assinar arquivos e verificar assinaturas
Pré-requisitos
SignTool, que faz parte do SDK do Windows
Um certificado de assinatura de código válido, por exemplo, um arquivo de Exchange de Informações Pessoais (.pfx) criado com as ferramentas MakeCert.exe e Pvk2Pfx.exe
Para obter informações sobre como criar um certificado de autenticação de código válido, consulte Como criar um certificado de assinatura de pacote de aplicativo.
Um aplicativo de Windows empacotado, por exemplo, um arquivo .appx criado usando a ferramenta de 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 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 da assinatura de um pacote de aplicativo usando 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 EKU (Uso de Chave Estendida) do certificado deve ser desconjunto ou conter o valor de EKU para assinatura de código (1.3.6.1.5.5.7.3.3).
- O campo uso de chave (KU) do certificado deve ser desaconstalado 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 configurações padrão para criar o pacote do aplicativo, o algoritmo de hash usado será SHA256.
Se você usou o empacotador de aplicativo 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 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 disponíveis no momento:
| Valor hashMethod | hashAlgorithm a ser usado |
|---|---|
| https://www.w3.org/2001/04/xmlenc#sha256 | SHA256 (padrão.appx) |
| 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 autenticação de um arquivo .pfx
-
SignTool sign /fd hashAlgorithm /a /f signingCert.pfx /p password filepath.appx
SignTool padrão o parâmetro /fd hashAlgorithm para SHA1 se ele não for especificado, e SHA1 não é válido para assinar pacotes de aplicativo. 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 /fd hashAlgorithm como SHA256:
SignTool sign /fd SHA256 /a /f signingCert.pfx /p password filepath.appx
Você pode omitir o parâmetro /p password 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 compatíveis com o 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; não há suporte para a operação.
Se você quiser carimbo de data/hora do pacote do aplicativo, deverá fazê-lo durante a operação de sinal. 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 do pacote do aplicativo
Além dos erros de assinatura que o SignTool pode retornar, o SignTool também pode retornar erros específicos à 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 indicará que o pacote que está sendo assinado é inválido. Nesse caso, antes de assinar o pacote, você deve recompilar o pacote. Para obter a lista completa de erros 0x8008*, consulte Códigos de Erro COM (Segurança e Instalaçã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
- Execute Eventvwr.msc.
- Abra o log de eventos: logs de aplicativos e serviços > Visualizador de Eventos (local) > Microsoft > Windows > AppxPackagingOM > Microsoft-Windows-AppxPackaging/Operational
- Procure o evento de erro mais recente.
O erro interno geralmente corresponde a um destes:
| ID do evento | Cadeia de caracteres de evento de exemplo | Sugestão |
|---|---|---|
| 150 | Erro 0x8007000B: O nome do editor de manifesto de aplicativo (CN = Contoso) deve coincidir com o nome do requerente do certificado de autenticação (CN = Contoso, C = US). | O nome do editor de manifesto de aplicativo deve corresponder exatamente ao nome do assunto após a assinatura.[! Observação] 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 de manifesto e o nome da entidade do certificado estão listados na mensagem de evento. |
| 151 | Erro 0x8007000B: O método de hash de assinatura especificado (SHA512) deve coincidir com o método de hash usado no mapa de blocos do pacote de aplicativos (SHA256). | O hashAlgorithm especificado no parâmetro /fd está incorreto (consulte a Etapa 1: Determinar o algoritmo de hash a ser usado). Execute Novamente o SignTool com o hashAlgorithm que corresponde ao mapa do bloco do pacote do aplicativo. |
| 152 | Erro 0x8007000B: O conteúdo do pacote de aplicativos deve ser validado em relação ao mapa de blocos. | O pacote de aplicativos está corrompido e precisa ser recompilado para gerar um novo mapa de blocos. Para obter mais informações sobre como criar um pacote de aplicativo, consulte como criar um pacote de aplicativo com o empacotador de aplicativos ou criar um pacote de aplicativo com Visual Studio 2012. |
Considerações de segurança
Depois que o pacote for assinado, o certificado que você usou para assinar o pacote ainda deverá ser confiável pelo computador no qual o pacote deve ser implantado. Ao adicionar um certificado em repositórios de certificados do computador local, você afetará a confiança do 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 prontamente 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.