O que é Code Signing (Assinatura de Código) | Entrust
A assinatura de código é o processo de assinar digitalmente arquivos executáveis e scripts usando uma ferramenta de assinatura e um certificado digital. Este processo é baseado em uma tecnologia conhecida como infraestrutura de chave pública (PKI).
O código de assinatura requer uma ferramenta de assinatura dedicada, como o Microsoft SignTool, Java's Jarsigner, ou mesmo o OpenSSL, dependendo do tipo de arquivo a ser assinado. A assinatura em si é uma operação criptográfica que vincula o conteúdo do arquivo a um certificado digital.
A assinatura de código protege sua empresa, seus parceiros e seus usuários finais contra adulteração de software ao baixar arquivos de programas executáveis, especialmente aqueles de canais não seguros, como a Internet. Como fornecedora de soluções de assinatura de código, a Entrust pode ajudar você a implementar soluções eficientes de assinatura de código de alta garantia que protejam sua empresa e os clientes contra ataques que forjam ou modificam aplicativos.
Qual é o propósito de assinar código digitalmente?
Há duas razões principais para assinar código digitalmente:
- Fornecer aos usuários a identidade da organização publicando o arquivo assinado
- Fornecer um meio para verificar a integridade do arquivo – ou seja, que ele não foi corrompido ou maliciosamente alterado desde que foi assinado
Certificados de assinatura de código da Entrust
Os certificados de assinatura de código são usados por desenvolvedores de software para assinar digitalmente aplicativos, drivers, executáveis e softwares. Isso verifica para os usuários finais se o código não foi comprometido ou invadido por terceiros. Para vincular as chaves públicas com o usuário associado (proprietário da chave privada), as infraestruturas de chaves públicas (PKIs) utilizam certificados digitais.
Boas práticas de assinatura de código
As práticas recomendadas para certificados de assinatura de código incluem:
- Controlar o acesso a chaves privadas
- Proteger chaves privadas com um módulo de segurança de hardware (HSM) em conformidade com a FIPS-140-2 nível 3
- Código de carimbo de data/hora
- Entenda a diferença entre a assinatura de teste e a assinatura de versão
- Autentique o código a ser assinado
- Distribua o risco para vários certificados
- Revogue certificados comprometidos
A Entrust oferece uma gama completa de certificados de assinatura de código e um método abrangente para gerenciá-los, incluindo certificados TLS/SSL, certificados de e-mail seguros, certificados de assinatura de documentos e certificados de dispositivos móveis.
Como funciona a assinatura de código?
Para implementar a assinatura de código, o editor de software precisa gerar um par de chaves públicas privadas e enviar a chave pública a uma autoridade de certificação, juntamente com uma solicitação para emitir um certificado de assinatura de código. A autoridade de certificação verifica a identidade do editor do software e autentica a solicitação de certificado assinado digitalmente do editor. Depois que esse processo de autorização e verificação de chave for concluído com êxito, a autoridade de certificação agrupará a identidade do editor com a chave pública e assinará o pacote. Esse processo cria o certificado de assinatura de código.
Saiba mais sobre como implementar a assinatura de código neste white paper.
Métodos para assinatura digital
Várias plataformas de aplicativos oferecem suporte à assinatura de código e diferentes ferramentas para realizar a assinatura. Veja abaixo uma lista dos tipos de assinatura de código mais comuns:
- Adobe AIR
- Biblioteca de desenvolvedores do Apple Mac OS X
- Firefox XPI
- Java
- Microsoft
Etapas para usuários finais
Há cinco etapas simples que os usuários devem seguir para determinar se o software pode ser confiável:
- Verifique se você estava planejando instalar o software.
- Verifique no nome do arquivo se está indicado o software que você estava planejando instalar. No exemplo anterior, o usuário está instalando o Adobe Reader 10, que o nome parece indicar.
- Verifique no nome do editor se corresponde a quem você acha que criou o software. Isso pode ser difícil, pois o site de download do software pode ser diferente do site do editor.
- Verifique no certificado de assinatura de código se o nome do editor consta no certificado.
- Verifique se o certificado foi emitido por uma CA publicamente confiável.
Recursos de assinatura de código
Os certificados validados da organização (OV) exibem a organização e o local no certificado. Não oferecem suporte para assinatura do modo kernel do Windows. Os certificados de validação estendida (EV) exibem a jurisdição e o tipo de organização, além da empresa e da localização. Os certificados de EV também facilitam a assinatura do modo kernel do Windows para Vista, Windows 7, Windows 8, Windows 8.1 e Windows 10. Escolher a solução de certificado de assinatura de código que é melhor para as necessidades da sua organização é complicado, mas a Entrust pode ajudar.
Soluções de assinatura de código
O portfólio de soluções de assinatura de código da Entrust combina módulos de segurança de hardware (HSMs) nShield invioláveis com a solução Code Signing Gateway da Entrust Professional Services. O Code Signing Gateway gerencia o fluxo de trabalho de autorização, aceita solicitações, notifica os aprovadores via e-mail, gerencia os tempos de espera, confirma as aprovações, registra a atividade e entrega o código assinado à área de preparação. A solução utiliza HSMs nShield da Entrust e Root of Trust, protegendo todas as chaves de assinatura em um HSM certificado para FIPS 140-2. Isso evita a perda potencial de chaves de assinatura valiosas — as chaves para a autenticidade e integridade de seu código. Também permite que os clientes assinem seu próprio código de software. Os recursos são:
- Filtro smartscreen Microsoft
- Integrações de terceiros
- Integrações ilimitadas
- Timestamping
- Status de editor identificado
- Redução de caixas de advertência
As soluções de assinatura de código Entrust são respaldadas por nossa ampla experiência em práticas recomendadas de assinatura de código e padrões de cuidado adequado.
Como a assinatura de código fornece a identidade da organização que publica o arquivo assinado?
Uma assinatura digital cria uma ligação criptográfica entre um arquivo e um certificado digital, este último representando uma organização. Você pode pensar no certificado como um carimbo de borracha digitalizado que contém detalhes sobre a organização, como seu nome legal, endereço de e-mail, endereço físico e país. O código de assinatura corresponde, portanto, à aplicação de um carimbo digital ao código, que exibirá os detalhes da organização.
Os detalhes de uma assinatura de código podem ser verificados cada vez que o arquivo assinado for aberto. Na maioria dos casos, isto é feito automaticamente pelos sistemas operacionais, mostrando o nome da organização contida no certificado utilizado para a assinatura.
Como a assinatura de código fornece um meio para verificar a integridade do arquivo?
Cada assinatura de código é criada com base no conteúdo do arquivo. Sem entrar em muitos detalhes técnicos, uma ferramenta de assinatura calculará uma versão condensada do arquivo para assinar – chamamos isso de hash – e assinará essa versão condensada usando o certificado digital fornecido. Este hash assinado é, em seguida, embutido no arquivo em um local dedicado à hospedagem de assinaturas digitais.
Uma vez iniciada a distribuição do arquivo assinado, os sistemas operacionais e aplicações relevantes detectarão a presença da assinatura. Eles calcularão automaticamente o hash do arquivo (sem incluir o hash assinado no cálculo) e o compararão com o hash assinado embutido no arquivo. Se ambos forem iguais, a verificação é aprovada. Se o hash calculado for diferente do hash assinado, uma falha é gerada. Uma verificação falhada indica que o conteúdo do arquivo foi modificado após a assinatura ter sido realizada (como resultado de um erro ou de uma intenção maliciosa).
A confiabilidade deste mecanismo é baseada na força do algoritmo usado para calcular o hash – quanto mais longo o hash, melhor. Um dos padrões atualmente utilizados é o SHA-256, um algoritmo que produz hashes de 256 bits.
Quais são os benefícios da assinatura de código?
Há vários benefícios obtidos ao assinar código digitalmente:
- Você aumenta a confiança do usuário em seu software. O código assinado prova que o arquivo não só pertence à organização esperada, mas também garante que não foi adulterado (para injetar malware, por exemplo).
- Você reforça sua reputação como desenvolvedor de software. Quanto mais softwares assinados você publicar, melhor será sua reputação. Por exemplo, o código Microsoft assina seu software para ajudar a garantir que seus clientes estejam baixando os arquivos certos. O software assinado também é útil para detectores de antivírus e malware. Se você assinar seu software, eles serão capazes de sinalizar versões suspeitas e não assinadas de seu software.
- Você evita avisos e bloqueios de sistemas operacionais. Eles realmente esperam que todos os editores de software assinem seus arquivos executáveis. Se você publicar um software não assinado e seus usuários o lançarem, há uma grande chance de verem uma mensagem de alerta do sistema operacional. MacOS é conhecido por se recusar a lançar arquivos não assinados, forçando o usuário a contornar a segurança para prosseguir com a instalação.
Uma mensagem de aviso para instalação de software não assinado no Microsoft Windows 10.
Uma mensagem de bloqueio para instalação de software não assinado no MacOS.
Para dispositivos IoT com o uso de firmware, uma das melhores maneiras de garantir atualizações seguras é construir seu firmware com a exigência de aceitar somente arquivos atualizados que são assinados com seus certificados de assinatura de código interno (privado).
Qual é a diferença entre a assinatura de código público e a assinatura de código privado?
Os certificados de assinatura de código são emitidos pelas autoridades de certificação (CAs), que são mecanismos de emissão de certificados. A maioria das organizações possui uma ou várias CA(s) “privadas” (internas) e pode emitir todos os tipos de certificados digitais, incluindo certificados de assinatura de código. Entretanto, as assinaturas geradas com estes certificados só são confiáveis dentro do ambiente interno da organização.
Embora isto seja perfeito para muitos casos de uso que envolvem aplicações internas e IoT, usar uma CA privada não funciona quando você planeja distribuir seu código fora de seu ambiente, onde sua CA não é reconhecida.
Certificados de assinatura de código emitidos por CAs de confiança pública, tais como os da Entrust, gerarão assinaturas que serão reconhecidas e confiáveis por todos os principais sistemas operacionais e aplicações mundiais. Organizações públicas de CAs (também chamadas de CAs públicas), tais como a Entrust, seguem normas rigorosas de emissão de certificados, devem passar por auditorias regulares e conquistar a confiança de cada grande fornecedor de sistemas operacionais ou aplicativos, tais como Microsoft, Apple, Google ou Mozilla.
Quando confrontados com código assinado, sistemas operacionais e aplicações verificam a CA de emissão do certificado utilizado para a assinatura. Se a CA emissora não estiver em sua “lista de confiança” (também chamada de armazenamento raiz), a assinatura não será confiável e a verificação falhará. É por esta razão que é importante obter certificados de assinatura de código de confiança pública ao publicar softwares na Internet.
Qual é a diferença entre a assinatura de código OV e a assinatura de código EV?
Embora as organizações sejam livres para incluir quaisquer detalhes que queiram em seus certificados de assinatura de código privado, os certificados públicos só devem conter informações que tenham sido verificadas minuciosamente pela CA pública antes da emissão do certificado.
Uma CA pública pode emitir duas categorias de certificados de assinatura de código de confiança pública: OV e EV. Estas categorias correspondem ao nível de verificação de sua organização que é realizada pela CA pública antes da emissão do certificado, e também a exigência de armazenamento do certificado (especificamente, para sua chave privada).
- OV (validação da organização): Este é um método de validação padrão de uma organização realizada por CAs. Envolve verificações da empresa (A empresa existe? Está em boa situação? Onde está localizada?) e uma verificação da pessoa que solicita o certificado em nome da organização (Realmente se trata de um funcionário da organização?).
- EV (validação estendida): Como o nome sugere, este é um processo de validação estendido que requer verificação adicional dos detalhes da organização, bem como do solicitante do certificado. A CA exigirá mais informações e documentações, e procederá com uma ou várias chamadas à organização e ao solicitante antes de emitir o certificado. O armazenamento seguro é obrigatório para certificados de assinatura de código EV, o que significa que você precisará de um token USB seguro ou de um módulo de segurança de hardware (HSM) para armazenar o certificado e sua chave privada.
A empresa pode fornecer fichas USB ou HSMs nShield para todos os pedidos de assinatura de código, sejam eles certificados OV ou EV.
Como funciona a marcação temporal com um certificado de assinatura de código?
No contexto de uma assinatura de código, a marcação temporal é o processo de aplicação de uma marcação temporal digital, que inclui a data e hora exatas, a uma assinatura de código.
A marcação temporal é uma etapa crucial, mas muitas vezes esquecida, da assinatura do código. As assinaturas realmente têm uma data de validade, que corresponde à data de validade do certificado de assinatura do código utilizado para a assinatura. Uma assinatura expirada levará a uma verificação falhada quando o código assinado for lançado, o que levaria a mensagens de aviso e até mesmo a impedir a execução do código.
Os certificados privados podem ter uma vida útil muito longa (mais de 10 anos) se necessário, o que muitas vezes é suficiente porque o código assinado pode não ser mais utilizado após um período tão longo. Contudo, os certificados de assinatura de código público são atualmente válidos por um período máximo de três anos, e há uma grande chance de que seu código ainda esteja disponível no final deste período. Fazer a marcação temporal em uma assinatura de código lhe dará mais 9-10 anos de validade (dependendo do período de validade do certificado de marcação temporal utilizado). Além disso, você pode reaplicar um novo carimbo de data/hora quando o atual estiver prestes a expirar para prorrogar ainda mais a validade de sua assinatura de código e evitar quaisquer avisos/bloqueios.
A marcação temporal também é útil caso você precise revogar seu certificado de assinatura de código se este tiver sido comprometido. A revogação pode ser retroativa para a data e hora em que você acredita que o certificado foi comprometido. Se todas as suas assinaturas tiverem uma marcação temporal, então somente as assinaturas geradas antes da data de revogação permanecerão válidas. Qualquer assinatura de código sem uma marcação temporal se tornará inválida quando o certificado expirar ou for revogado.
A marcação temporal pode ser feita usando certificados de marcação temporal privados de uma CA interna. Porém, para códigos que precisam ser compartilhados externamente, você deve usar um serviço público de marcação temporal, que será reconhecido e confiável por todos os principais sistemas operacionais e aplicações. A maioria, se não todos as CAs públicas, incluindo a Entrust, oferecem um serviço público de marcação temporal, disponível através de uma URL dedicada.