Inno Setup (Parte 9): Assinando digitalmente o instalador

Qualidade: 

Estrela ativaEstrela ativaEstrela ativaEstrela ativaEstrela ativa
 

Ao contrário do que você possa imaginar, o procedimento de assinatura dos executáveis de instaladores e desinstaladores criados com o Inno Setup é basicamente o mesmo utilizado para assinar qualquer executável. A única diferença é que o Inno Setup possui mecanismos internos para auxiliar nessa assinatura, principalmente em se tratando da assinatura dos desinstaladores, os quais são criados no momento da compilação do instalador, mas são incluídos compactados dentro deste último, em suma, não seria possível assinar o executável do desinstalador usando meios que não são providos pelo próprio Inno Setup, por isso a leitura deste artigo se torna essencial caso você tenha intenção de assinar os executáveis dos seus instaladores.

Por que assinar o instalador?

Se você tem acompanhado este tutorial desde o começo, deve com certeza ter testado o instalador que estamos desenvolvendo e certamente deve ter notado1 a seguinte caixa de diálogo:

A mensagem é potencialmente assustadora e bastante clara. Usuários leigos que executam programas sem prestar muita atenção, ao menos terão uma última chance de impedir a execução de um programa potencialmente perigoso, já que, como a mensagem diz, o aplicativo é de um fornecedor desconhecido.

O objetivo da assinatura do executável de instalação e desinstalação é, no mínimo substituir esta caixa de diálogo por uma outra que apenas informe o usuário final, mas sem assustá-lo!2

Está gostando do que está lendo? Ajude nosso site visitando nossos patrocinadores. Obrigado! :)

Mãos à obra!

Você precisará de um certificado (arquivo .pfx). Se você não tem um, crie um certificado autoassinado, tal como explicado no artigo Assinando digitalmente aplicações Delphi. Como é de praxe eu vou mostrar a forma como eu costumo fazer, a qual funciona perfeitamente, no entanto não é a única forma. Eu vou usar o SignTool da Microsoft e uma combinação específica de parâmetros, tanto no SigTool quanto na configuração do mesmo dentro do Inno Script Studio, por isso, sinta-se à vontade para pesquisar mais a respeito. Sem mais delongas:

  1. Abra o script ZOISE.iss no Inno Script Studio;

  2. Clique no menu Tools > Configure Sign Tools...:

    Isso vai mostrar a tela de opções do Inno Script Studio, já com a opção Code Signing Tools selecionada;

  3. Clique na opção Add (adicionar), na parte superior da tela:

    A tela Sign Tool Properties vai ser exibida. Ela possui dois campos que precisam ser preenchidos. Informe no campo Name, um nome para identificar de forma simples o comando. Este nome será usado como uma espécie de alias para o comando. Informe no campo Command o caminho completo para a ferramenta de assinatura (SignTool.exe) e mais dois parâmetros, $p e $f. Nenhum destes parâmetros são do SignTool.exe, eles fazem sentido apenas para o Inno Setup. O parâmetro $p, será substituído posteriormente pelos parâmetros reais do SignTool.exe e o parâmetro $f é substituído automaticamente pelo nome do arquivo a ser assinado, no caso, ele será substituído em dois momentos, primeiro ele será substituído pelo executável do desinstalador, e só depois pelo executável do desinstalador. Após definir o nome e o comando, pressione OK para fechar a tela Sign Tool Properties e OK novamente para fechar a tela de opções do Inno Script Studio. Neste momento a ferramenta de assinatura está pronta para ser usada;

  4. De volta a tela do script, no final da seção [Setup], inclua duas linhas tais como estas vistas na figura abaixo:

    A imagem não mostra, mas vou transcrever abaixo as duas linhas:

    SignTool=MSSignTool sign /f "{#ProjectBaseDir}\inno\instalador\ZOISE.pfx" /p 123456
    SignedUninstaller=True

    A segunda linha é óbvia, ela instrui o compilador do Inno Setup a assinar o executável do desinstalador. A primeira linha, no entanto, carece de uma explicação mais detalhada. No passo anterior nós definimos o alias MSSignTool=C:\Program Files (x86)\Windows Kits\10\bin\x64\SignTool.exe $p $f, mas a fim de facilitar a explicação, desconsidere o caminho completo e assuma o alias MSSignTool=SignTool.exe $p $f. Na primeira linha mostrada acima, tudo que vem após a palavra MSSignTool será repassado a SignTool.exe no parâmetro $p, logo, a linha de comando final gerada será SignTool.exe sign /f "{#ProjectBaseDir}\inno\instalador\ZOISE.pfx" /p 123456 $f, que é a linha de comando correta para assinar um executável, o qual vai depender do valor de $f, que será substituído pelo nome do executável do desinstalador e pelo nome do executável do instalador, nesta ordem, em momentos distintos durante a compilação, portanto, a linha de comando da assinatura será executada duas vezes.

    Falando especificamente da linha de comando do SignTool.exe, {#ProjectBaseDir}\inno\instalador\ZOISE.pfx é o caminho completo para o certificado a ser utilizado na assinatura e 123456 é a senha deste certificado. Substitua estes valores pelos corretos, caso você esteja usando seu próprio certificado
Está gostando do que está lendo? Ajude nosso site visitando nossos patrocinadores. Obrigado! :)

O resultado final

Após realizar os passos da seção anterior, basta recompilar o script e executar o instalador. Caso nenhuma caixa de diálogo apareça, a assinatura funcionou. Caso uma caixa de diálogo apareça, ela deverá ser como a caixa de diálogo a seguir:

Como se pode observar a caixa de diálogo exibida quando o instalador está assinado é bem menos assustadora do que aquela que aparecia quando ele não estava assinado. Nesta caixa de diálogo podemos ver que ele identificou corretamente o fornecedor e até mesmo mostrou o nome interno do instalador e seu ícone, coisas que não eram exibidas quando o instalador não estava assinado.

Caso você continue vendo a caixa de diálogo antiga, que não mostra o fornecedor, clique com o botão direito no executável do instalador e clique em Propriedades. Uma aba adicional (Assinaturas Digitais) deve existir:

Caso esta aba não exista, verifique o log de compilação do seu instalador na parte de baixo da tela do Inno Script Studio, para saber se houve algum erro durante a compilação do mesmo. Verifique também a linha de comando final (também mostrada no log de compilação) em busca de erros, tais como senha errada, falta de aspas, etc. Para se certificar que a linha de comando está correta, basta copiá-la e executá-la manualmente no prompt de comando.

Caso esta aba exista, o motivo da não exibição da caixa de diálogo correta é um certificado inválido, expirado, ou que não tem sua cadeia de certificação totalmente verificada (confiável). Se você optou por utilizar um certificado autoassinado como o ZOISE.pfx (que vai dentro do arquivo .rar anexado a este artigo), você precisa colocá-lo na lista de autoridades de certificação raiz confiáveis do Windows, para fazer isso, leia o artigo Assinando digitalmente aplicações Delphi, mais especificamente a seção Como instalar e confirmar que nosso certificado é confiável?

Arquivos anexados
URLDescriçãoTamanhoModificado em
Access this URL (https://sourceforge.net/projects/addicted2delphi/files/inno.rar)inno.rarArquivos necessários para criação do instalador e do programa de exemplo (que será instalado). Este arquivo será atualizado à medida que o tutorial for sendo feito e ao final conterá a solução completa0 KB28/05/2018 às 22:02
e-max.it: your social media marketing partner
1Se no seu sistema nenhuma tela como essa foi apresentada, provavelmente você ou alguém responsável pelo seu Windows alterou as configurações do Controle de Conta de Usuário de forma que notificações desta natureza sejam suprimidas. Particularmente eu acho esta este aviso muito útil
2Dependendo das configurações de Controle de Conta de Usuário, uma caixa de diálogo diferente pode ser exibida. Em configurações menos restritivas pode ser possível que nenhuma caixa de diálogo seja exibida
Ajude nosso site visitando nossos patrocinadores!

Temos 22 visitantes e Nenhum membro online nos últimos 10 minutos (2.2 visitantes por minuto).