Assinando digitalmente aplicações Delphi
Qualidade: Gostou? Não gostou? Qualifica! 5 estrela(s) Qualificar!
Criado: Sexta, 18 Novembro 2016 11:30 Categoria: Artigos
Publicado: Sábado, 26 Novembro 2016 00:00 Última Atualização: Domingo, 04 Dezembro 2016 19:56
Acessos: 3820 Escrito por Carlos B. Feitoza Filho
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:
http://zettaomnis.net.br/portal/index.php/a2dmei/articlesa2dmei/112assinandoaplicacoesdelphi 1/14
2017522 Assinando digitalmente aplicações Delphi ZettaØmnis Soluções Tecnológicas
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, seguindoo à 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/cresceonumerodemalwarescomcertificadodigital
legitimodizmcafee/). 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/certificaccedilatildedigitalsaibaquanto
custacomoobterseu. 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 useo 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 lembrese 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 antiví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 Win321. 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
em https://www.microsoft.com/enus/download/details.aspx?id=8279. É 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
http://zettaomnis.net.br/portal/index.php/a2dmei/articlesa2dmei/112assinandoaplicacoesdelphi 2/14
2017522 Assinando digitalmente aplicações Delphi ZettaØmnis Soluções Tecnológicas
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, salveo 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> = Email para contato, por exemplo, admin@tapiocamasters.net
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 = admin@tapiocamasters.net
http://zettaomnis.net.br/portal/index.php/a2dmei/articlesa2dmei/112assinandoaplicacoesdelphi 3/14
2017522 Assinando digitalmente aplicações Delphi ZettaØmnis Soluções Tecnológicas
Após criar o arquivo e certificarse 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:
http://zettaomnis.net.br/portal/index.php/a2dmei/articlesa2dmei/112assinandoaplicacoesdelphi 4/14
2017522 Assinando digitalmente aplicações Delphi ZettaØmnis Soluções Tecnológicas
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:
http://zettaomnis.net.br/portal/index.php/a2dmei/articlesa2dmei/112assinandoaplicacoesdelphi 5/14
2017522 Assinando digitalmente aplicações Delphi ZettaØmnis Soluções Tecnológicas
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":
http://zettaomnis.net.br/portal/index.php/a2dmei/articlesa2dmei/112assinandoaplicacoesdelphi 6/14
2017522 Assinando digitalmente aplicações Delphi ZettaØmnis Soluções Tecnológicas
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
http://zettaomnis.net.br/portal/index.php/a2dmei/articlesa2dmei/112assinandoaplicacoesdelphi 7/14
2017522 Assinando digitalmente aplicações Delphi ZettaØmnis Soluções Tecnológicas
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 antivirus 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 AutoAssinado. Na aba Detalhes existem mais informações sobre o seu certificado:
http://zettaomnis.net.br/portal/index.php/a2dmei/articlesa2dmei/112assinandoaplicacoesdelphi 8/14
2017522 Assinando digitalmente aplicações Delphi ZettaØmnis Soluções Tecnológicas
Observe os campos Emissor e Requerente e veja que ambos possuem exatamente os mesmos valores. Isso é
uma característica de um certificado autoassinado.
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...:
http://zettaomnis.net.br/portal/index.php/a2dmei/articlesa2dmei/112assinandoaplicacoesdelphi 9/14
2017522 Assinando digitalmente aplicações Delphi ZettaØmnis Soluções Tecnológicas
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.
http://zettaomnis.net.br/portal/index.php/a2dmei/articlesa2dmei/112assinandoaplicacoesdelphi 10/14
2017522 Assinando digitalmente aplicações Delphi ZettaØmnis Soluções Tecnológicas
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:
http://zettaomnis.net.br/portal/index.php/a2dmei/articlesa2dmei/112assinandoaplicacoesdelphi 11/14
2017522 Assinando digitalmente aplicações Delphi ZettaØmnis Soluções Tecnológicas
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:
http://zettaomnis.net.br/portal/index.php/a2dmei/articlesa2dmei/112assinandoaplicacoesdelphi 12/14
2017522 Assinando digitalmente aplicações Delphi ZettaØmnis Soluções Tecnológicas
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:
http://zettaomnis.net.br/portal/index.php/a2dmei/articlesa2dmei/112assinandoaplicacoesdelphi 13/14
2017522 Assinando digitalmente aplicações Delphi ZettaØmnis Soluções Tecnológicas
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.
http://zettaomnis.net.br/portal/index.php/a2dmei/articlesa2dmei/112assinandoaplicacoesdelphi 14/14