Compartilhar via


Assinatura Authenticode para desenvolvedores de jogos

A autenticação de dados é cada vez mais importante para os desenvolvedores de jogos. O Windows Vista e o Windows 7 têm vários recursos, como controles parentais, que exigem que os jogos sejam assinados corretamente para garantir que ninguém tenha adulterado os dados. O Microsoft Authenticode permite que os usuários finais e o sistema operacional verifiquem se o código do programa vem do proprietário legítimo e se ele não foi alterado maliciosamente ou corrompido acidentalmente. Este artigo discute como começar a autenticar seu jogo e como integrar a autenticação em um processo de compilação diário.

Observação

A partir de 1º de janeiro de 2016, o Windows 7 e posterior não confiam mais em nenhum certificado de assinatura de código SHA-1 com data de expiração de 1º de janeiro de 2016 ou posterior. Consulte Imposição do Windows de assinatura de código Authenticode e carimbo de data/hora para obter mais informações.

Tela de fundo

Os certificados digitais são usados para estabelecer a identidade do autor. Os certificados digitais são emitidos por um terceiro confiável conhecido como Autoridade de Certificação (CA), como VeriSign ou Thawte. A autoridade de certificação é responsável por verificar se o proprietário não está reivindicando uma identificação falsa. Depois de solicitar um certificado a uma autoridade de certificação, os desenvolvedores comerciais podem esperar uma resposta para seu aplicativo em menos de duas semanas.

Depois que a autoridade de certificação decide que você atende aos critérios de política, ela gera um certificado de assinatura de código que está em conformidade com X.509, o formato de certificado padrão do setor criado pela União Internacional de Telecomunicações, com extensões da Versão 3. Esse certificado identifica você e contém sua chave pública. Ele é armazenado pela autoridade de certificação para referência, e uma cópia é fornecida a você eletronicamente. Ao mesmo tempo, você também cria uma chave privada que você deve manter segura e que você não deve compartilhar com ninguém, mesmo a CA.

Depois de ter uma chave pública e privada, você pode começar a distribuir software assinado. A Microsoft fornece ferramentas para fazer isso no SDK do Windows. As ferramentas utilizam um hash unidirecional, produzem um resumo de comprimento fixo e geram uma assinatura criptografada com uma chave privada. Em seguida, eles combinam essa assinatura criptografada com seu certificado e credenciais em uma estrutura conhecida como bloco de assinatura e a incorporam no formato de arquivo do executável. Qualquer tipo de arquivo binário executável pode ser assinado, incluindo DLLs, arquivos executáveis e arquivos de gabinete.

A assinatura pode ser verificada de várias maneiras. Os programas podem chamar a função CertVerifyCertificateChainPolicy e SignTool (signtool.exe) pode ser usado para verificar uma assinatura no prompt de linha de comando. O Windows Explorer também tem uma guia Assinaturas Digitais em Propriedades do Arquivo que exibe cada certificado de um arquivo binário assinado. (A guia Assinaturas Digitais só aparece em Propriedades do Arquivo para arquivos assinados.) Além disso, um aplicativo pode ser auto-verificado usando CertVerifyCertificateChainPolicy.

A assinatura Authenticode não é apenas útil para autenticação de dados por usuários finais, mas também é necessária para a aplicação de patches de Contas de Usuário Limitadas e por controles parentais no Windows Vista e no Windows 7. Além disso, tecnologias futuras em sistemas operacionais Windows também podem exigir que o código seja assinado, portanto, é altamente recomendável que todos os desenvolvedores profissionais e amadores adquiram um certificado de assinatura de código de uma CA. Mais informações sobre como isso é feito podem ser encontradas posteriormente neste artigo em Usando uma autoridade de certificação confiável.

O código do jogo, os patchers e os instaladores podem aproveitar ainda mais a assinatura do Authenticode verificando se os arquivos são autênticos no código. Isso pode ser usado para anti-cheat e segurança de rede geral. O código de exemplo para verificar se um arquivo está assinado pode ser encontrado aqui: Programa C de exemplo: Verificando a assinatura de um arquivo PE e o código de exemplo para verificar a propriedade de um certificado de assinatura em um arquivo assinado pode ser encontrado aqui: Como obter informações de executáveis assinados pelo Authenticode.

Introdução

Para começar, a Microsoft fornece ferramentas com o Visual Studio 2005 e o Visual Studio 2008 e no SDK do Windows, para ajudar a executar e verificar o processo de assinatura de código. Depois de instalar o Visual Studio ou o SDK do Windows, as ferramentas descritas neste artigo técnico estão localizadas em um subdiretório da instalação, que pode incluir um ou mais dos seguintes:

  • %SystemDrive%\Arquivos de Programas\Microsoft Visual Studio 8\SDK\v2.0\Bin
  • %SystemDrive%\Arquivos de Programas\Microsoft Visual Studio 8\VC\PlatformSDK\Bin
  • %SystemDrive%\Arquivos de Programas\Microsoft Visual Studio 9.0\SmartDevices\SDK\SDKTools\
  • %SystemDrive%\Arquivos de Programas\Microsoft SDKs\Windows\v6.0A\bin\

As ferramentas a seguir são as mais úteis para assinar o código:

Ferramenta de Criação de Certificados (MakeCert.exe)

Gera um certificado X.509 de teste, como um arquivo .cer, que contém sua chave pública e uma chave privada, como um arquivo .pvk. Este certificado é apenas para fins de teste interno e não pode ser usado publicamente.

pvk2pfx.exe

Cria um arquivo de troca de informações pessoais (.pfx) a partir de um par de arquivos .cer e .pvk. O arquivo .pfx contém sua chave pública e privada.

SignTool (SignTool.exe)

Assina o arquivo usando o arquivo .pfx. SignTool suporta a assinatura de arquivos DLL, arquivos executáveis, arquivos do Windows Installer (.msi) e arquivos de gabinete (.cab).

Observação

Ao ler outra documentação, você pode encontrar referências ao SignCode (SignCode.exe), mas essa ferramenta foi preterida e não é mais suportada — use SignTool em vez disso.

 

Usando uma autoridade de certificação confiável

Para obter um certificado confiável, você deve se inscrever em uma autoridade de certificação (CA), como VeriSign ou Thawte. A Microsoft não recomenda nenhuma autoridade de certificação em detrimento de outra, mas se você quiser se integrar ao serviço Relatório de Erros do Windows (WER), considere usar o VeriSign para emitir o certificado, pois o acesso ao banco de dados WER requer uma conta WinQual que requer uma ID VeriSign. Para obter uma lista completa de autoridades de certificação confiáveis de terceiros, consulte Membros do programa de certificado raiz da Microsoft. Para obter mais informações sobre como se registrar no WER, consulte "Apresentando o Relatório de Erros do Windows" na Zona ISV.

Depois de receber o certificado da CA, você pode assinar seu programa usando SignTool e liberá-lo para o público. No entanto, você deve ter cuidado para proteger sua chave privada, que está contida em seus arquivos .pfx e .pvk. Certifique-se de manter esses arquivos em um local seguro.

Exemplo usando um certificado de teste

As etapas a seguir demonstram a criação de um certificado de assinatura de código para fins de teste, seguido pela assinatura de um programa de exemplo Direct3D (chamado BasicHLSL.exe) com esse certificado de teste. Esse procedimento cria arquivos .cer e .pvk — suas chaves pública e privada, respectivamente — que não podem ser usados para certificação pública.

Neste exemplo, um carimbo de data/hora também é adicionado à assinatura. Um carimbo de data/hora impede que a assinatura se torne inválida quando o certificado expirar. O código assinado, mas sem carimbo de data/hora, não será validado após a expiração do certificado. Portanto, todo código lançado publicamente deve ter um carimbo de data/hora.

Para criar um certificado e assinar um programa

  1. Crie um certificado de teste e uma chave privada usando a Ferramenta de Criação de Certificado (MakeCert.exe).

    O exemplo de linha de comando a seguir especifica MyPrivateKey como o nome de arquivo para o arquivo de chave privada (.pvk), MyPublicKey como o nome de arquivo para o arquivo de certificado (.cer) e MySoftwareCompany como o nome do certificado. Ele também torna o certificado auto-assinado, para que ele não tenha uma autoridade raiz não confiável.

    MakeCert /n CN=MySoftwareCompany /r /h 0 /eku "1.3.6.1.5.5.7.3.3,1.3.6.1.4.1.311.10.3.13" /e 12-31-2020 /sv MyPrivateKey.pvk MyPublicKey.cer
    
  2. Crie um arquivo de Troca de Informações Pessoais (.pfx) a partir do arquivo de chave privada (.pvk) e do arquivo de certificado (.cer) usando pvk2pfx.exe.

    O arquivo .pfx combina suas chaves pública e privada em um único arquivo. O exemplo de linha de comando a seguir usa os arquivos .pvk e .cer da etapa anterior para criar o arquivo .pfx chamado MyPFX com a senha your_password:

    pvk2pfx.exe -pvk MyPrivateKey.pvk -spc MyPublicKey.cer -pfx MyPFX.pfx -po your_password
    
  3. Assine seu programa com seu arquivo de troca de informações pessoais (.pfx) usando o SignTool.

    Você pode especificar várias opções na linha de comando. O exemplo de linha de comando a seguir usa o arquivo .pfx da etapa anterior, fornece your_password como a senha, especifica BasicHLSL como o arquivo a ser assinado e recupera um carimbo de data/hora de um servidor especificado:

    signtool.exe sign /fd SHA256 /f MyPFX.pfx /p your_password /v /t URL_to_time_stamp_service BasicHLSL.exe
    

    Observação

    A URL para o serviço de carimbo de data/hora é fornecida pela autoridade de certificação e é opcional para teste. É importante que a assinatura de produção inclua uma autoridade de carimbo de data/hora válida ou a assinatura não será validada quando o certificado expirar.

     

  4. Verifique se o programa está assinado usando SignTool.

    O exemplo de linha de comando a seguir especifica que SignTool deve tentar verificar a assinatura em BasicHLSL.exe usando todos os métodos disponíveis enquanto fornece saída detalhada:

    signtool.exe verify /a /v BasicHLSL.exe
    

    Neste exemplo, SignTool deve indicar que o certificado está anexado, ao mesmo tempo em que declara que ele não é confiável, uma vez que não é emitido por uma CA.

  5. Confie no certificado de teste.

    Para certificados de teste, você precisa confiar no certificado. Essa etapa deve ser ignorada para certificados fornecidos por uma autoridade de certificação, pois eles serão confiáveis por padrão.

    Somente nos computadores em que você deseja confiar no certificado de teste, execute o seguinte:

    certmgr.msc
    

    Em seguida, clique com o botão direito do mouse em Autoridades de Certificação Raiz Confiáveis e escolha Todas as Tarefas | Importação. Em seguida, navegue até o arquivo .pfx criado e siga as etapas do assistente, colocando o certificado nas Autoridades de Certificação Raiz Confiáveis.

    Quando o assistente for concluído, você poderá começar a testar com o certificado confiável nesse computador.

Integrando a assinatura de código no sistema de compilação diária

Para integrar a assinatura de código em um projeto, você pode criar um arquivo em lotes ou script para executar as ferramentas de linha de comando. Depois que o projeto for criado, execute SignTool com as configurações apropriadas (como mostrado na etapa 3 do nosso exemplo).

Seja especialmente cauteloso em seu processo de compilação para garantir que o acesso aos arquivos .pfx e .pvk seja restrito ao menor número possível de computadores e usuários. Como prática recomendada, os desenvolvedores só devem assinar código usando o certificado de teste até que estejam prontos para serem enviados. Novamente, a chave privada (.pvk) deve ser mantida em um local seguro, como um cofre ou sala trancada, e idealmente em um dispositivo criptográfico, como um cartão inteligente.

Outra camada de proteção é fornecida usando o Microsoft Authenticode para assinar o próprio pacote do Windows Installer (MSI). Isso ajuda a proteger o pacote MSI contra adulteração e corrupção acidental. Consulte a documentação da ferramenta de criação MSI para obter mais informações sobre como assinar pacotes com o Authenticode.

Revogação

Caso a segurança da chave privada seja comprometida ou algum evento relacionado à segurança torne um certificado de assinatura de código inválido, o desenvolvedor deve revogar o certificado. Não fazer isso enfraqueceria a integridade do desenvolvedor e a eficácia da assinatura de código. Uma autoridade de certificação também pode emitir uma revogação com um tempo específico; O código assinado com um carimbo de data/hora anterior à hora de revogação ainda será considerado válido, mas o código com um carimbo de data/hora subsequente será inválido. A revogação de certificado afeta o código em todos os aplicativos assinados com o certificado revogado.

Drivers de assinatura de código

Os drivers podem e devem ser assinados por Authenticode. Os drivers de modo kernel têm requisitos adicionais: as edições de 64 bits do Windows Vista e do Windows 7 impedirão a instalação de todos os drivers de modo kernel não assinados e todas as versões do Windows apresentarão um prompt de aviso quando um usuário tentar instalar um driver não assinado. Além disso, os administradores podem definir a Diretiva de Grupo para impedir que drivers não assinados sejam instalados no Microsoft Windows Server 2003, Windows XP Professional x64 Edition e edições de 32 bits do Windows Vista e Windows 7.

Muitos tipos de drivers podem ser assinados com uma assinatura confiável da Microsoft — como parte do Programa de Certificação do Windows do Windows Hardware Quality Labs (WHQL) ou do Programa de Assinatura Não Classificada (anteriormente chamado de Assinatura de Confiabilidade de Driver) — que permite que o sistema confie totalmente nesses drivers e os instale mesmo sem credenciais administrativas.

No mínimo, os drivers devem ser assinados por Authenticode, porque os drivers não assinados ou autoassinados (ou seja, assinados com um certificado de teste) não serão instalados em muitas plataformas baseadas no Windows. Para obter mais informações sobre como assinar drivers e código e recurso relacionado, consulte Requisitos de assinatura de driver para Windows no Windows Hardware Developer Central.

Resumo

Usar o Microsoft Authenticode é um processo simples. Depois de obter um CER e criar uma chave privada, é uma questão simples de usar as ferramentas fornecidas pela Microsoft. Em seguida, você pode habilitar recursos importantes no Windows Vista e no Windows 7, como controles parentais, e informar aos clientes que seu produto vem diretamente de seu proprietário legítimo.

Mais informações

Para obter mais informações sobre ferramentas e processos relacionados ao código de assinatura, consulte os links a seguir: