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 controle dos pais, 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 a um processo de compilação diário.
- Background
- Introdução
- Usando uma autoridade de certificação confiável
- Exemplo usando um certificado de teste
- Integrando a assinatura de código ao sistema de compilação diária
- Revogação
- Drivers de assinatura de código
- Resumo
- Mais informações
Observação
A partir de 1º de janeiro de 2016, o Windows 7 e versões posteriores 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 CA é responsável por verificar se o proprietário não está reivindicando uma identidade falsa. Depois de solicitar um certificado a uma CA, os desenvolvedores comerciais podem esperar uma resposta ao seu aplicativo em menos de duas semanas.
Depois que a CA decide que você atende aos critérios de política, ela gera um certificado de assinatura de código que está em conformidade com o 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 CA para referência e uma cópia é fornecida a você eletronicamente. Ao mesmo tempo, você também cria uma chave privada que deve manter segura e que não deve compartilhar com ninguém, nem mesmo com a CA.
Depois de ter uma chave pública e privada, você pode começar a distribuir o 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 ao 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 o 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 autoverificado usando CertVerifyCertificateChainPolicy.
A assinatura Authenticode não é útil apenas para autenticação de dados por usuários finais, mas também é necessária para correção de Contas de Usuário Limitadas e por controles parentais no Windows Vista e 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 geral da rede. O código de exemplo para verificar se um arquivo está assinado pode ser encontrado aqui: Exemplo de programa C: 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 podem ser encontrados 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 seguintes ferramentas são as mais úteis para assinar código:
-
Ferramenta de criação de certificado (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 .pfx (Personal Information Exchange) a partir de um par de arquivos .cer e .pvk. O arquivo .pfx contém sua chave pública e privada.
-
Ferramenta de Sinalização (SignTool.exe)
-
Assina o arquivo usando o arquivo .pfx. O 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 está obsoleta e não tem mais suporte — use o SignTool.
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 CA em detrimento de outra, mas se você quiser integrá-la ao serviço WER (Relatório de Erros do Windows), 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 de terceiros confiáveis, consulte Membros do Programa de Certificado Raiz da Microsoft. Para obter mais informações sobre como se registrar no WER, consulte "Introdução ao Relatório de Erros do Windows" na Zona ISV.
Depois de receber seu certificado da CA, você pode assinar seu programa usando o 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 um carimbo de data/hora, não será validado depois que o certificado expirar. Portanto, todo código divulgado publicamente deve ter um carimbo de data/hora.
Para criar um certificado e assinar um programa
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 do arquivo de chave privada (.pvk), MyPublicKey como o nome do arquivo de certificado (.cer) e MySoftwareCompany como o nome do certificado. Ele também torna o certificado autoassinado, 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
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úblicas e privadas 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
Assine seu programa com seu arquivo .pfx (Personal Information Exchange) 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 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.
Verifique se o programa está assinado usando SignTool.
O exemplo de linha de comando a seguir especifica que o SignTool deve tentar verificar a assinatura no BasicHLSL.exe usando todos os métodos disponíveis ao fornecer uma saída detalhada:
signtool.exe verify /a /v BasicHLSL.exe
Neste exemplo, o SignTool deve indicar que o certificado está anexado, ao mesmo tempo em que declara que ele não é confiável, pois não é emitido por uma autoridade de certificação.
Confie no certificado de teste.
Para certificados de teste, você precisa confiar no certificado. Esta 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 que você criou 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 ao 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 o SignTool com as configurações adequadas (conforme 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 o 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 deverá revogar o certificado. Não fazer isso enfraqueceria a integridade do desenvolvedor e a eficácia da assinatura do código. Uma CA também pode emitir uma revogação com tempo específico; O código assinado com um carimbo de data/hora anterior à hora da 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 do 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 do 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 WHQL (Windows Hardware Quality Labs) ou do Programa de Assinatura Não Classificada (anteriormente chamado de Assinatura de Confiabilidade do Driver), o 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, pois 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 recursos relacionados, 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 simples questão 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 legítimo proprietário.
Mais informações
Para obter mais informações sobre ferramentas e processos relacionados à assinatura de código, consulte os seguintes links: