Assinaturas de autenticação de carimbo de data/hora

As assinaturas do Microsoft Authenticode fornecem garantias de autoria e integridade para dados binários. O carimbo de data/hora do authenticode é baseado em contraprogramações padrão do PKCS nº 7. As ferramentas de assinatura da Microsoft permitem que os desenvolvedores afixem carimbos de data/hora ao mesmo tempo em que afixam assinaturas do Authenticode. O carimbo de data/hora permite que as assinaturas do Authenticode sejam verificáveis mesmo depois que os certificados usados para assinatura expirarem.

Uma breve introdução ao Authenticode

O Authenticode aplica a tecnologia de assinatura digital para garantir a autoria e a integridade de dados binários, como software instalável. Um navegador da Web cliente ou outros componentes do sistema podem usar as assinaturas do Authenticode para verificar a integridade dos dados quando o software é baixado ou instalado. As assinaturas de autenticação podem ser usadas com muitos formatos de software, incluindo .cab, .exe, .ocx e .dll.

A Microsoft mantém uma lista de autoridades de certificação públicas (ACs). Os emissores de certificados Authenticode atualmente incluem SSL.com, Digicert, Sectigo(Comodo)e GlobalSign.

Sobre carimbo de data/hora criptográfica

No passado, uma variedade de métodos de carimbo de data/hora criptográfica foram propostos. Confira, por exemplo, Haber e Stornetta "How to Time-Stamp a Digital Document" no Journal of Cryptology (1991) e Benaloh and de Mare "One-Way Accumulators: A Decentralized Alternative to Digital Signatures" in Springer-Verlag Lecture Notes in Computer Science vol. 765 (EUROCRYPT '93). Um resumo estendido deste artigo está disponível na Microsoft Research. (Esses recursos podem não estar disponíveis em alguns idiomas e países ou regiões.) Como o tempo é físico, em vez de uma quantidade matemática, esses métodos geralmente dizem respeito a como vincular objetos para que sua ordem de criação possa ser determinada ou como agrupar objetos com eficiência que podem ser descritos como tendo sido criados simultaneamente.

Sistemas que pretendem autenticar o tempo como uma quantidade sempre exigem alguma forma de confiança. Em uma configuração fortemente adversária, protocolos complexos podem ser usados para garantir algum grau de sincronização. No entanto, esses protocolos exigem ampla interação entre as partes afetadas. Na prática, se precisar apenas de certificação de tempo de uma fonte confiável, a origem poderá simplesmente agir como um notário fornecendo uma instrução assinada (certificação) de que o objeto foi apresentado para assinatura no momento indicado.

O método de contra-atribuição de carimbo de data/hora implementado abaixo permite que as assinaturas sejam verificadas mesmo depois que o certificado de assinatura expirou ou foi revogado. O carimbo de data/hora permite que o verificador saiba de forma confiável a hora em que a assinatura foi afixada e, assim, confie na assinatura se ela fosse válida naquele momento. O carimbo de data/hora deve ter uma fonte de tempo confiável e protegida.

Documentos assinados e contraassinaturas do PKCS nº 7

O PKCS nº 7 é um formato padrão para dados criptográficos, incluindo dados assinados, certificados e CRLs ( listas de revogação de certificados ). O tipo específico de interesse PKCS nº 7 no contexto de carimbo de data/hora são dados assinados, correspondentes ao tipo de conteúdo SignedData definido do PKCS nº 7.

O pacote PKCS nº 7 consiste em SignedData que identifica o conteúdo real e determinadas informações sobre ele e os blocos de assinatura SignerInfo. Um SignerInfo pode conter uma contra-atribuição, que recursivamente é outro SignerInfo. Em princípio, uma sequência dessas contraassinaturas pode estar presente. A contra-atribuição é um atributo não autenticado em relação à assinatura no SignerInfo; ou seja, ele pode ser afixado após a assinatura original. No formulário de estrutura de tópicos:

SignedData (PKCS #7)

  • Versão (do PKCS nº 7, geralmente versão 1)
  • DigestAlgorithms (coleção de todos os algoritmos usados por blocos de assinatura SignerInfo, para processamento otimizado)
  • ContentInfo (contentType é igual a SignedData, além de conteúdo ou referência ao conteúdo)
  • Certificados OPCIONAIS (coleção de todos os certificados usados)
  • CRLs OPCIONAIS (coleção de todas as CRLs)
  • Blocos de assinatura SignerInfo (a assinatura real, composta por um ou mais blocos de assinatura SignerInfo)

SignerInfo (o bloco de assinatura)

  • Versão (do PKCS nº 7, geralmente versão 1)
  • Certificado (emissor e número de série para identificar exclusivamente o certificado do signatário em SignedData)
  • DigestAlgorithm mais o DigestEncryptionAlgorithm mais o Digest (hash), além do EncryptedDigest (assinatura real)
  • OPTIONAL AuthenticatedAttributes (por exemplo, assinado por este signatário)
  • OPTIONAL UnauthenticatedAttributes (por exemplo, não assinado por este signatário)

Um exemplo de um atributo autenticado é o tempo de assinatura (OID 1.2.840.113549.1.9.5) porque faz parte do que o serviço de carimbo de data/hora assina. Um exemplo de um atributo não autenticado é a contraprocuração (OID 1.2.840.113549.1.9.6) porque ela pode ser afixada após a assinatura. Nesse caso, o próprio SignerInfo contém um SignerInfo (a Countersignature).

Observação

O objeto que está assinado na contra-atribuição é a assinatura original (ou seja, EncryptedDigest do SignerInfo original).

 

SignTool e o Processo de Autenticação

O SignTool está disponível para assinatura do Authenticode e dados binários de carimbo de data/hora. A ferramenta é instalada na pasta \Bin do caminho de instalação do SDK (Software Development Kit) do Microsoft Windows.

Assinar e carimbar dados binários é relativamente simples usando o SignTool. O editor deve obter um certificado de assinatura de código de uma AC de assinatura de código comercial. Para conveniência, a Microsoft publica e atualiza uma lista de CAs públicas, incluindo aquelas que emitem certificados Authenticode. Quando prontos para publicação, os arquivos de objeto são assinados e carimbados usando parâmetros de linha de comando apropriados com a ferramenta SignTool. O resultado de qualquer operação SignTool é sempre um formato PKCS nº 7 SignedData.

O SignTool aceita como entrada dados binários brutos a serem assinados e com carimbo de data/hora ou dados binários assinados anteriormente para serem carimbados. Os dados que foram assinados anteriormente podem ser carimbados usando o comando de carimbo de data/hora signtool .

Argumento Descrição
/tHTTPAddress Indica que o arquivo deve ter carimbo de data/hora. Uma URL que especifica um endereço de um servidor de carimbo de data/hora deve ser fornecida. /t pode ser usado com os comandos signtool sign e signtool timestamp .

 

Para obter mais informações sobre ferramentas que podem ser úteis nesse contexto, consulte Ferramentas de Criptografia e SignTool.

Detalhes da implementação e formato de transmissão

O SignTool depende da implementação do Windows Authenticode para criar e assinaturas de carimbo de data/hora. O Authenticode opera em arquivos binários, por exemplo, .cab, .exe, .dll ou .ocx. O Authenticode primeiro cria a assinatura, produzindo um PKCS #7 SignedData. É esse SignedData que deve ser contra-atribuído, conforme descrito em PKCS nº 9.

O processo de contra-atribuição ocorre em quatro etapas:

  1. Copie a assinatura (ou seja, encryptedDigest) do SignerInfo do PKCS #7 SignedData.
  2. Construa uma solicitação de carimbo de data/hora cujo conteúdo seja a assinatura original. Envie isso para o servidor de carimbo de data/hora Notação de Sintaxe Abstrata Um (ASN.1) codificado como um TimeStampRequest.
  3. Receba um carimbo de data/hora, formatado como um segundo PKCS #7 SignedData, retornado do servidor de carimbo de data/hora.
  4. Copie o SignerInfo do carimbo de data/hora diretamente para o PKCS nº 7 SignedData original, como uma contra-atribuição PKCS #9 (ou seja, um atributo não autenticado no SignerInfo do original).

Solicitação de carimbo de data/hora

A solicitação de carimbo de data/hora é enviada em uma mensagem POST HTTP 1.1. No cabeçalho HTTP, a diretiva CacheControl é definida como sem cache e a diretiva Content-Type é definida como application/octet-stream. O corpo da mensagem HTTP é uma codificação base64 da codificação de Distinguished Encoding Rules (DER) da solicitação de carimbo de data/hora.

Embora não seja usada no momento, a diretiva Content-Length também deve ser usada na construção da mensagem HTTP porque ajuda o servidor de carimbo de data/hora a localizar onde a solicitação está dentro do HTTP POST.

Outros cabeçalhos HTTP também podem estar presentes e devem ser ignorados se não forem compreendidos pelo solicitante ou pelo servidor de carimbo de data/hora.

A solicitação de carimbo de data/hora é uma mensagem codificada em ASN.1. O formato da solicitação é o seguinte.

TimeStampRequest ::= SEQUENCE {
   countersignatureType OBJECT IDENTIFIER,
   attributes Attributes OPTIONAL, 
   content  ContentInfo
}

O countersignatureType é o OID (identificador de objeto ) que identifica isso como uma marca de carimbo de data/hora e deve ser o OID exato 1.3.6.1.4.1.311.3.2.1.

Nenhum atributo está incluído atualmente na solicitação de carimbo de data/hora.

O conteúdo é um ContentInfo, conforme definido pelo PKCS nº 7. O conteúdo são os dados a serem assinados. Para carimbo de data/hora da assinatura, o ContentType deve ser Dados e o conteúdo deve ser o encryptedDigest (assinatura) do SignerInfo do conteúdo PKCS #7 a ser carimbado.

Resposta de carimbo de data/hora

A resposta de carimbo de data/hora também é enviada em uma mensagem HTTP 1.1. No cabeçalho HTTP, a diretiva Content-Type também é definida como application/octet-stream. O corpo da mensagem HTTP é uma codificação base64 da codificação DER da resposta de carimbo de data/hora.

A resposta de carimbo de data/hora é uma mensagem assinada por PKCS nº 7 assinada pelo carimbo de data/hora. O ContentInfo da mensagem PKCS nº 7 é idêntico ao ContentInfo recebido no carimbo de data/hora. O conteúdo PKCS nº 7 contém o atributo autenticado de tempo de assinatura (definido em PKCS nº 99, OID 1.2.840.113549.9.5).

Depois que o Authenticode recebe o carimbo de data/hora do servidor, o Authenticode incorpora o carimbo de data/hora no PKCS nº 7 Original SignedData como uma contra-atribuição. Para fazer isso, o ContentInfo do PKCS #7 SignedData retornado é descartado e o SignerInfo do carimbo de data/hora retornado é copiado como uma contra-atribuição no SignerInfo do PKCS nº 7 SignedData original. A cadeia de certificados do carimbo de data/hora também é copiada em Certificados no PKCS nº 7 SignedData original como um atributo não autenticado do signatário original.