Zetta-Ømnis Soluções Tecnológicas
Desenvolvendo hoje a tecnologia do amanhã
Visite Nosso Patrocinador
Você está aqui:
DO NOT UNDERSTAND PORTUGUESE? CLICK ON THE FLAG TO CHANGE THE LANGUAGE!

Assinando digitalmente aplicações Delphi

Imagem meramente ilustrativa

Gosto de fazer alguns exemplos em casa e levar para o trabalho a fim de mostrar algumas novidades para meus colegas desenvolvedores. Felizmente não temos restrição nesse aspecto, o que é muito bom. Várias vezes eu já desenvolvi soluções para o trabalho em minha casa, porque sim, sou viciado em Delphi e programação é meu hobby. O problema é que ultimamente eu tenho notado que todos os programas que eu compilo em casa não rodam direito no PC do trabalho. Eles têm comportamentos estranhos, ficam extremamente lentos, têm problemas para pintar a tela e seus botões não funcionam. Resumindo: o programa fica inútil! Veja abaixo um exemplo de como um de meus programas aparece:

Além dos labels e dos botões não aparecerem, clicar nestes botões é também inútil. O programa não responde e fica também muito lento. O que na verdade deveria aparecer era a tela abaixo:

Após algumas pesquisas eu descobri que alguns programas instalados no PC podem bloquear parcial ou totalmente nossas aplicações. Descobri ainda que o programa que estava bloqueando minha aplicação era, nada mais, nada menos que um daqueles plugins de proteção de Internet Banking. A solução básica seria simplesmente desinstalar esses programas, mas infelizmente eu preciso acessar o Internet Banking e preciso que eles permaneçam instalados, além disso, eu estou buscando uma solução correta e definitiva. Supondo que você precise instalar um de seus programas na máquina de um cliente, acredito que ele não ficaria nem um pouco contente ao saber que precisaria desinstalar os plugins guardiões e consequentemente não poderia mais acessar o Internet Banking de seu banco. A única forma de harmonizar a convivência entre meus programas e os programas temperamentais dos bancos é assinando digitalmente minhas aplicações.


O que é uma assinatura digital?

No mundo real, uma assinatura é um meio de validar um documento. Documentos só tem validade quando assinados e muitos deles precisam ter a assinatura em si validada (firma reconhecida), de forma a comprovar que ela não é falsa. Uma assinatura digital é basicamente a mesma coisa, só que ao invés de usarmos tinta, usamos bytes. Grosso modo, um executável é como um documento, e ao executá-lo é como se você estivesse confiando no conteúdo desse documento, seguindo-o à risca. Qualquer cláusula abusiva existente nesse documento será executada também, acontece que, na verdade, quem sofre as consequências caso esse documento contenha cláusulas abusivas é o Sistema Operacional e por isso, assinar um executável tem a finalidade de informar ao SO que aquele "documento" é válido e não contém clausulas que prejudiquem o SO.

Se você é um leitor atento, agora deve estar pensando como um certificado pode comprovar que o conteúdo de um executável não é prejudicial. A resposta é surpreendentemente simples: não pode! Isso mesmo, a assinatura digital não garante que um executável não seja malicioso (leia mais a respeito disso em http://idgnow.com.br/internet/2013/10/04/cresce-o-numero-de-malwares-com-certificado-digital-legitimo-diz-mcafee/). Então, como uma assinatura pode ajudar a proteger nosso SO de código malicioso?

Eu falei anteriormente que muitas vezes ao assinarmos um documento precisamos validar até mesmo a assinatura, reconhecendo em cartório a firma. Não é diferente com assinaturas digitais, existem órgãos certificadores confiáveis (Comodo, Thawte, VeriSign, CertiSign, etc.) que têm por função fornecer assinaturas digitais válidas para pessoas e empresas. Como entidades certificadoras confiáveis elas garantem que os certificados digitais gerados por elas são reais e pertencem à pessoa ou entidade que eles representam. Certificados fornecidos por estas empresas certificadoras podem ser usados para assinar um executável, mas, como você deve estar imaginando, fazer isso é um pouco burocrático e pago. Veja como (e quanto) em: http://www.infomoney.com.br/negocios/noticia/423356/certifica-ccedil-atilde-digital-saiba-quanto-custa-como-obter-seu. Mesmo obtendo um certificado digital válido, de uma empresa certificadora reconhecida, ainda assim, a assinatura de um executável não garante que ele não vá formatar seu HD ou rodar um keylogger, no entanto, a assinatura válida tornará mais fácil identificar o responsável e por isso, um executável assinado digitalmente com um certificado criado por uma empresa séria, dificilmente conterá código malicioso. Ninguém quer se queimar, não é mesmo?

Se você é uma empresa e pretende assinar seus executáveis, eu recomendo que você crie seu certificado digital formalmente e use-o para assinar seus programas. Esta é a forma mais correta. Se você é um desenvolvedor pequeno e não quer perder tempo nem dinheiro comprando um certificado, é perfeitamente válido criar o seu próprio e usá-lo totalmente grátis. Mas lembre-se de que esse tipo de certificado é como simplesmente assinar um documento sem reconhecer a firma, ou seja, você está dizendo que o certificado te representa, mas não tem nenhuma empresa por trás para dizer que isso é verdade. A implicação disso é que se algum programa no SO tentar validar a assinatura de seu executável, certamente ele não vai conseguir, contudo, para resolver os problemas causados por plugins de internet banking e alguns anti-vírus, a assinatura simples funciona perfeitamente, portanto, continue lendo :)

O que é necessário?

Para realizar a assinatura de um executável você vai precisar basicamente do OpenSSL e de uma ferramenta chamada SignTool. O OpenSSL em sua forma binária instalável pode ser encontrado em https://slproweb.com/products/Win32OpenSSL.html. Baixe a versão mais recente para Win32[1]. O OpenSSL será utilizado para a geração de nosso certificado personalizado com nossas informações.

O SignTool é uma ferramenta disponível no SDK do Windows, o qual pode ser baixado diretamente da Microsoft (links no final do artigo). É o SignTool que será usado para assinar o nosso executável com o certificado gerado pelo OpenSSL.


Criando nosso certificado pessoal

A criação do certificado pessoal consiste de duas etapas. Primeiramente precisamos gerar um certificado PKCS#12 (arquivo .pem) e em seguida exportar a partir desse certificado um arquivo .pfx (Personal Information Exchange). O certificado PKCS#12 contém nossas informações e uma chave privada e o arquivo pfx contém, encapsulado em si mesmo, um arquivo de chave pública (arquivo .cer) e um arquivo de chave privada (arquivo .pvk).

A minha forma de criação do arquivo .pem vai ser diferente daquelas encontradas na internet. Eu constatei que a forma usual de criação desse arquivo não contempla o uso de caracteres especiais e nem acentuados. Como falantes da língua portuguesa, precisamos de um meio de permitir que as informações contidas no arquivo .pem possam ser compostas, também, de caracteres acentuados.

Primeiramente, crie um arquivo de texto simples em formato UTF8. Você pode usar no Notepad++, ou qualquer outro editor que permita salvar texto plano em formato UTF8. Após criar o arquivo, salve-o com um nome adequado e extensão .cfg. Cole dentro desse arquivo o seguinte conteúdo:

[req]
distinguished_name = req_distinguished_name
prompt = no
utf8 = yes
default_keyfile = <KEYFILE>
encrypt_key = no

[req_distinguished_name]
C = <C>
ST = <ST>
L = <L>
O = <O>
OU = <OU>
CN = <CN>
emailAddress = <E>

Após colar este conteúdo, substitua os campos destacados da seguinte forma:

  • <KEYFILE> = Coloque o caminho completo para o arquivo .pem que será gerado. Cada barra invertida deve ser duplicada, por exemplo, d:\\zetapioca.pem, seria um valor válido
  • <C> = Código de duas letras para o país. No caso do Brasil, esse valor seria BR
  • <ST> = Nome do estado ou província, por exemplo, São Paulo
  • <L> = Nome da localidade (cidade), por exemplo, São José dos Campos
  • <O> = Nome da organização, nome empresarial ou Razão Social, por exemplo, Da Silva Alimentos de Mandioca, Ltda.
  • <OU> = Nome da unidade organizacional responsável por esta assinatura, por exemplo, Unidade de Desenvolvimento de Sistemas
  • <CN> = Nome comum que identificará o signatário. O valor deste campo varia segundo a aplicação do certificado. Como estamos usando este certificado para assinar uma aplicação, este valor pode ser a Razão Social (o mesmo que se colocou no campo <O>) ou mesmo um nome fantasia da empresa, por exemplo, Tapioca Masters
  • <E> = E-mail para contato, por exemplo, Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.

Você não deve alterar nenhum outro ponto deste texto, a não ser aqueles indicados acima. A título de visualização mais clara, abaixo está o exemplo de nosso arquivo, o qual chamaremos de zetapioca.cfg:

[req]
distinguished_name = req_distinguished_name
prompt = no
utf8 = yes
default_keyfile = d:\\zetapioca.pem
encrypt_key = no

[req_distinguished_name]
C = BR
ST = São Paulo
L = São José dos Campos
O = Da Silva Alimentos de Mandioca, Ltda.
OU = Unidade de Desenvolvimento de Sistemas
CN = Tapioca Masters
emailAddress = Este endereço de email está sendo protegido de spambots. Você precisa do JavaScript ativado para vê-lo.

Após criar o arquivo e certificar-se de que ele está em UTF8 e com todas as informações corretas, abra um prompt de comando, mude para o diretório bin, que está dentro do diretório do OpenSSL e, de lá, execute o seguinte comando:

Openssl.exe req -x509 -days 730 -newkey rsa:1024 -config meusdados.cfg -out meucertificado.pem

Substitua meusdados.cfg pelo caminho completo para seu arquivo de configurações que foi gerado no passo anterior. Substitua meucertificado.pem pelo mesmo caminho completo informado na chave default_keyfile do arquivo de configurações que foi gerado no passo anterior, a diferença é que aqui não serão necessárias as barras invertidas duplicadas. Veja abaixo como deve ser a saída desse comando após pressionarmos ENTER: 

Tal como mostra a saída acima, no local indicado, o arquivo .pem (PKCS#12) será gerado. Em nosso exemplo o arquivo zetapioca.pem foi gerado em D:\. Se você for tão curioso como eu, você vai abrir este arquivo para ver o que foi gerado. Vou te poupar desse trabalho. Dentro do arquivo .pem gerado, existe o seguinte conteúdo:

Tal como eu disse anteriormente, o arquivo .pem contém apenas nossa chave privada (Private Key) e nossas informações em um certificado. Ambas as informações estão obviamente criptografadas. Toda vez que esse arquivo é gerado, seu conteúdo muda, mesmo que todas informações sejam idênticas, portanto, aquilo que você está vendo na imagem acima não vai ser igual àquilo que você gerar, mesmo que você use as mesmas informações que eu usei.

O próximo passo é, a partir do arquivo .pem, extrair um arquivo .pfx. Para realizar essa extração, execute o comando a seguir novamente a partir do diretório bin da pasta do OpenSSL:

Openssl.exe pkcs12 -export -passout pass:senhaaqui -in meucertificado.pem -out meucertificado.pfx

Novamente, acima, substitua meucertificado.pem pelo caminho completo para o arquivo gerado na etapa anterior.

Substitua meucertificado.pfx pelo caminho completo onde o arquivo .pfx deverá ser gerado. Eu recomendo usar o mesmo caminho onde o arquivo .pem estiver.

Onde se lê senhaaqui, informe a senha que será aplicada ao seu arquivo .pfx gerado. Essa senha é a segurança do seu certificado, de forma que ninguém além de você possa usá-lo. Ao pressionar ENTER seu arquivo .pfx será gerado no local especificado. Veja abaixo a tela após a geração do pfx em nosso exemplo:

Note que a execução do comando anterior não emite qualquer resultado, é como se nada tivesse sido feito, mas foi! Verifique que o arquivo .pfx foi criado no local indicado no comando. Se erros tivessem sido emitidos, este arquivo não teria sido gerado. Novamente você deve estar curioso para saber o que existe no arquivo .pfx, mas vou logo dizendo, ele é binário! Não há nada de especial no arquivo, a não ser o fato de que ele agora pode ser usado para, finalmente, assinar uma aplicação :)


Assinando uma aplicação Delphi (ou qualquer outra...)

Após a geração do arquivo .pfx poderemos assinar nossa aplicação. É o arquivo .pfx que, por meio da ferramenta SignTool, assinará nosso executável. Para realizar a assinatura abra novamente o prompt de comando, acesse a pasta Microsoft SDKs\Windows\v7.1\Bin e, dentro dela, execute o seguinte comando:

Signtool sign /f meucertificado.pfx /p minhasenha meuexecutavel.exe

Mais uma vez, substitua meucertificado.pfx pelo nome e local do arquivo .pfx. Substitua minhasenha pela senha que foi informada ao gerar o arquivo .pfx e, no final do comando (meuexecutavel.exe), informe o caminho do executável que deverá ser assinado. Veja abaixo a tela do prompt de comando ao se assinar um executável:

Isto feito, se nós clicarmos com o botão direito do mouse no executável e clicarmos em Propriedades, notaremos que existe mais uma aba de nome "Assinaturas Digitais":

Veja que em Nome do signatário aparece o nome que nós informamos no campo <CN> (Common Name) do arquivo .cfg, logo, é neste campo onde você deve colocar a informação que você pretende que apareça em Nome do signatário. Ao selecionar a assinatura na lista, o botão Detalhes ficará habilitado e ao clicá-lo, a seguinte tela será mostrada:

Nesta tela são exibidas mais algumas informações sobre nossa assinatura, mas atente para a mensagem no topo: Uma cadeia de certificação foi processada, mas terminou em um certificado raiz que não é confiável para o provedor de confiabilidade. Essa mensagem informa que a nossa assinatura digital não foi validada por uma entidade certificadora reconhecida. Isso era esperado, porque fomos nós quem geramos nosso próprio certificado e o Windows não tem condição de saber se essa assinatura é válida. Essa informação não apareceria se nosso certificado tivesse sido criado por um órgão certificador (CertiSign, VeriSign, etc.). Apesar de isso parecer um problema sério, na verdade não é NA MAIORIA DOS CASOS. Por exemplo, a incompatibilidade de meus softwares com os plugins guardiões dos bancos foi totalmente resolvida com essa assinatura simples.

Podem existir outros softwares de proteção que exijam uma assinatura válida gerada por um órgão certificador, neste caso não há nada a ser feito, a não ser pagar pela geração de um certificado válido, mas pode acreditar, se você chegar no ponto de precisar de fato de um certificado emitido por uma entidade certificadora, você certamente o fará, porque até então eu não vi nenhum sistema reclamar das assinatura simples. Em outras palavras, se o sistema de um cliente tem algum programa guardião ou anti-virus que requer que seu programa seja assinado e validado, certamente este cliente é um cliente importante o suficiente para que você invista nesta "assinatura digital com firma reconhecida".

Na tela anterior você pode clicar em Exibir Certificado, para exibir uma tela como esta:

Nesta tela, todas as características e informações sobre o seu certificado são exibidas. Explore as outras abas para ver o que elas contém.

Note que o certificado tem uma validade de 2 anos. Isso se deve ao parâmetro -days 730 que foi usado na criação do arquivo PKCS#12 (arquivo .pem). Uma outra quantidade de dias poderia ter sido informada a fim de suprir suas necessidades.

Observe que os campos Emitido para e Emitido por, contém a mesma informação. Isso é absolutamente esperado, já que foi você mesmo quem emitiu (gerou) o certificado para si mesmo. Este tipo de certificado se chama Auto-Assinado. Na aba Detalhes existem mais informações sobre o seu certificado:

Observe os campos Emissor e Requerente e veja que ambos possuem exatamente os mesmos valores. Isso é uma característica de um certificado auto-assinado.

Por último, mas não menos importante, e voltando à aba Geral, a informação sobre certificado raiz não confiável é novamente exibida, mas há um detalhe adicional, veja: Para ativar a confiabilidade, instale este certificado no repositório de autoridades de certificação raiz confiáveis. Este texto rebuscado diz que você pode instalar seu certificado em um local específico, onde todo e qualquer certificado é considerado confiável. O nome deste local é o Repositório de Autoridades de Certificação Raiz Confiáveis.


Como instalar e confirmar que nosso certificado é confiável?

Você não precisa marcar seu certificado como confiável na grande maioria dos casos, mas, a título de aprendizado você pode fazê-lo de duas formas. Se você já estiver na tela abaixo, clique em Instalar Certificado...:

Caso você não esteja na tela acima, você pode dar duplo clique no arquivo .pfx. Em ambos os casos, a seguinte tela vai aparecer:

Selecione o local do repositório de acordo com sua necessidade e clique em Avançar até que a tela a seguir apareça. A quantidade de telas a exibir antes que a tela abaixo apareça varia. Se você executou o Assistente para Importação de Certificados dando duplo clique no arquivo .pfx, duas telas adicionais serão exibidas. Se este for o caso, não é necessário alterar nenhuma das informações mostradas a não ser informar a senha do arquivo .pfx quando solicitada.

Na tela acima, selecione Colocar todos os certificados no repositório a seguir e clique o botão Procurar. A tela a seguir será mostrada:

Selecione Autoridades de Certificação Raiz Confiáveis, que foi exatamente o que foi recomendado anteriormente para tornar seu certificado confiável, e clique OK. Você retornará a tela anterior, então pressione o botão Avançar e a tela de resumo a seguir vai aparecer:

Clique em Concluir para, finalmente, instalar seu certificado no repositório escolhido. Nesse momento o Windows vai emitir um último aviso, semelhante ao da figura a seguir:

Se você confia em você mesmo, clique em Sim :) Brincadeiras à parte, o que este aviso diz é que você, o usuário do SO, está explicitamente dizendo que este certificado é confiável e vai transformá-lo numa Autoridade Certificadora Raiz Confiável dentro do seu SO. Em outras palavras, ao pressionar Sim, Tapioca Masters vai se transformar em uma entidade certificadora confiável e que, qualquer certificado emitido por Tapioca Masters será automaticamente confiável. Ao pressionar Sim a seguinte caixa de diálogo vai aparecer:

Isso concluiu a instalação e a confirmação de que seu certificado é confiável. Para comprovar que tudo ocorreu bem, clique com o botão direito do mouse no executável que foi assinado, clique em Propriedades e acesse a aba Assinaturas Digitais. Selecione a assinatura digital e clique em Detalhes:

Ao contrário da primeira vez que você viu essa tela, ela não mais contém o aviso sobre certificado raiz não confiável, provando que nosso certificado, para o SO, é válido e confiável! Ao clicar em Exibir Certificado também se nota que nosso certificado é confiável, veja:

Assistente para assinatura digital de executáveis

Alguns dias depois de publicar este artigo eu tive uma ideia para automatizar todos os passos em um arquivo de lote e foi aí que eu pensei que poderia fazer bem melhor que isso. Assim surgiu o Zetta-Ømnis Digital Signing Assistant, o qual disponibilizo gratuitamente em anexo a este artigo. Não vou dar maiores detalhes sobre este programa, pois ele é bem simples e intuitivo. Se você leu o artigo, certamente saberá usá-lo.


  Arquivos anexados  
Arquivo Descrição Tamanho Modificado em
Access this URL (https://www.microsoft.com/en-us/download/details.aspx?id=8279) Windows 7 SDK Microsoft Windows SDK for Windows 7 and .NET Framework 4. Este foi o SDK que eu usei quando este artigo foi ao ar. Ele deve funcionar para Windows 8 também 0.1 KB 13/06/2017 às 16:09
Access this URL (https://go.microsoft.com/fwlink/?LinkID=698771) Windows 10 SDK Recentemente precisei reinstalar o SDK do Windows e ao baixar a versão do link anterior eu notei que ela não funcionava direito (não instalava). Descobri que havia uma versão específica para Windows 10, que é esta deste link 0 KB 13/06/2017 às 16:11
Download this file (zosa.zip) ZOSA Assistente para assinatura digital de executáveis 833 KB 03/12/2016 às 02:35

1 Existe uma versão de 64 bits, mas eu nunca a usei, portanto não posso falar nada a respeito. Use-a se assim desejar
Acesso Rápido
Não digite mais que o necessário...



Escaneie este QRCode em dispositivos móveis para acessar a página atual rapidamente nestes dispositivos
Conteúdo Verificado!
#BULLSHITFREE #CLICKBAITFREE
#MONEYLESS
Este site é amigo do desenvolvedor do mundo real
Gostou do conteúdo?
Se você gostou do conteúdo que está lendo, você pode ajudar a manter este site no ar doando qualquer quantia. Use os botões abaixo para realizar sua doação.
 
É rápido, fácil e indolor :)
 

Estatísticas em tempo real

Visite Nosso Patrocinador