Assinaturas digitais: como o Sleek aproveita o Cloud HSM para garantir a integridade de documentos legais

Google Developers em Google Developers Follow Jul 10 · 12 min ler

Postado por Oleksandr Rudenko, Chefe de Tecnologia, Sleek, Julien Frerot, VP de Plataforma, Sleek, Jerome Poudevigne, Arquiteto de Startup, Google Cloud

A Sleek faz parte de uma nova onda de provedores de serviços corporativos que oferecem o primeiro atendimento corporativo e contábil on-line para sua empresa registrada em Cingapura.

Tradicionalmente, os serviços corporativos eram semelhantes aos escritórios de advocacia – conservadores e baseados em papel, com muito pouco em termos de automação ou digitalização. A plataforma on-line da Sleek permite que empreendedores e proprietários de empresas gerenciem a conformidade de sua empresa em qualquer lugar. Uma parte integral da oferta da Sleek para seus clientes é a capacidade de usar assinaturas eletrônicas para assinar documentos corporativos, como constituições, acionistas e resoluções do conselho. Os clientes que incorporaram uma empresa de Cingapura com interessados internacionais podem gerar seus documentos de governança, convertê-los em PDFs e enviá-los aos interessados em todo o mundo para que assinem o documento (inserindo sua assinatura manuscrita ou digitando o nome deles). , com uma trilha de auditoria completa das ações do usuário). Isso reduz o tempo de processo de algumas semanas para algumas horas ou mesmo alguns minutos, pois não há necessidade de enviar documentos em papel pelo mundo todo.

Uma vez que todas as partes estejam concluídas, a Sleek assinará digitalmente o documento para garantir que o processo de assinatura seja seguido e possa ser auditado, e irá selá-lo para garantir a integridade do documento.

Para alcançar este objectivo, de acordo com especificação oficial formato PDF , Elegante conta com a Plataforma Google Cloud , e particularmente o Service Cloud Key Management (Cloud KMS) ea Nuvem HSM (Módulo Cloud Security Hardware), bem como uma série de produtos de código aberto para orquestrar uma dança criptográfica complexa.

Se você está familiarizado com as assinaturas digitais, e apenas quer ver como o Sleek funciona, você pode pular para lá agora . Caso contrário, primeiro vamos revisar alguns conceitos gerais sobre assinatura digital e, em seguida, abordaremos o código.

Primer de assinaturas digitais

Assinaturas digitais fornecem os meios eletrônicos para afirmar que um documento não foi adulterado, bem como certificar a identidade de quem o apôs. Portanto, resume-se a como gerar uma assinatura e como autenticar uma assinatura (certificando-se de que um documento assinado não tenha sido alterado).

Como construir uma assinatura digital para um PDF

Assinar digitalmente um PDF é conceitualmente simples. Primeiro, você precisa possuir um par de chaves pública / privada (é por isso que as chaves públicas / privadas são legais ) e um certificado para provar que essa chave pública é sua . Então, você precisa de um arquivo PDF para assinar (duh!).

Com estes, você irá:

  1. Calcular um resumo do conteúdo do arquivo (usando um hash forte como SHA-2 )
  2. Criptografe o resumo propriamente dito com sua chave privada .
  3. Esse resumo criptografado é a assinatura do documento.
  4. Em seguida, distribua o arquivo PDF, a assinatura (ou seja, o resumo criptografado), a chave pública contida no certificado e o método de hash.

É claro que enviar separadamente esses quatro dados para cada arquivo seria impraticável. Felizmente, o capítulo 12.8 da especificação Portable Document Format contém uma maneira de anexá-los ao final do arquivo PDF. Estou simplificando, mas o resultado final é que você pode distribuir tudo em um único arquivo. Como tudo é autônomo, facilita a execução de validações dinamicamente.

Está tudo no diagrama abaixo.

Criando e incorporando uma assinatura digital em um arquivo PDF

Como validar uma assinatura digital para um PDF

OK, recebemos um arquivo assinado… como proceder?

Bem… se a assinatura contiver um certificado (como deveria), nós vamos assim:

  1. Leia o certificado e valide sua autenticidade (usando a cadeia de confiança fornecida pelas autoridades de certificação)
  2. Extraia a chave pública do certificado
  3. Descriptografar a assinatura usando a chave pública e obter o resumo original
  4. Calcule o resumo de arquivo usando o método de hash fornecido
  5. Compare o resumo que eles calculam com o resumo descriptografado
  6. Se eles forem idênticos, isso significa que o arquivo PDF que eles possuem é o mesmo que o arquivo PDF que você assinou (em virtude das propriedades das funções hash ). Em outras palavras, não foi adulterado (e nem a assinatura, a propósito).
  7. Se eles não são idênticos, algo é duvidoso é que você não deve confiar neste documento

O diagrama a seguir ilustra esse processo.

Validando uma assinatura digital incorporada

Então, se o certificado é válido e o arquivo não foi adulterado, o que sabemos? Bem, agora, não só sabemos que o conteúdo está correto, mas também sabemos que ele foi assinado pela entidade correta .

Informação essencial se este é um contrato ou algum outro documento importante!

Tudo isso é feito usando as mesmas tecnologias que basicamente protegem todos os sistemas de pagamento globais, HTTPS em seu navegador, etc. Então é bonito, muito forte!

Documentos assinados na natureza e leitores em conformidade

Há vários produtos ( comerciais ou de código aberto ) que implementam os processos bastante complexos de assinatura, incorporação da assinatura no PDF e validação de toda a tarefa quando necessário.

O Adobe Acrobat e todos os leitores de conformidade (ou seja, leitores de PDF que estão em conformidade com a especificação pública da Adobe) podem ler essa assinatura e executar as etapas de validação descritas acima imediatamente ao abrir o documento.

Eles mostrarão um alerta se as coisas estiverem incorretas, significando que o documento pode ter sido adulterado, o certificado pode ser inválido, a assinatura pode estar errada etc.

Colocando tudo junto

Vamos ver agora como podemos colocar todo esse conhecimento em bom uso para assinar digitalmente nossos PDFs usando um certificado. Nós precisamos:

  1. Obter um par de chaves pública / privada
  2. Adquirir um certificado para a chave pública
  3. Comece a assinar.

Vamos usar várias ferramentas para isso. Cada um deles desempenha um papel específico, como abaixo.

  • The Legion of Bouncy Castle : Uma sólida biblioteca de criptografia de código aberto que pode ser usada para gerar assinaturas, resumos, etc.
  • Apache PDFBox : Uma biblioteca Java de código aberto para manipular arquivos PDF. Usamos para inserir assinaturas digitais produzidas com o BouncyCastle em documentos;
  • Serviço de gerenciamento do Google Cloud Key + Cloud HSM : serviço de gerenciamento de chaves hospedado na nuvem e hardware especializado para proteger as chaves.

Usando o Serviço de gerenciamento do Google Cloud Key com o Cloud HSM

Tudo na criptografia assimétrica depende de seu (s) par (es) público / privado (s). E é absolutamente crucial que a chave privada permaneça um segredo que ninguém mais pode acessar.

Você pode gerenciar a maior parte disso manualmente, usando o OpenSSL para gerar suas chaves e ocultar cuidadosamente seus arquivos, mas, em vez disso, o Sleek aproveita o serviço de gerenciamento de chaves do Google Cloud (Cloud KMS). Este serviço oferece uma vasta gama de recursos para gerar, usar e gerenciar chaves de criptografia (simétricas e assimétricas).

O GCP também oferece o Cloud HSM , um serviço hospedado do HSM ( Hardware Security Module ). Um HSM é um computador especial que hospeda e protege suas chaves de criptografia. Há muitos recursos avançados, mas o que é de interesse especial para nós é o fato de que as chaves privadas que usamos e criamos não podem ser acessadas por terceiros ou extraídas do Cloud HSM.

Essa é a razão pela qual o principal requisito para aproveitar um certificado de assinatura de documento corporativo emitido por uma Autoridade de Certificação (CA), registrada na Lista de Confiança Aprovada da Adobe (AATL) é que a chave privada deve ser armazenada com segurança em um HSM.

O Cloud KMS e o Cloud HSM trabalham juntos, por isso, podemos pedir ao Cloud KMS para criar nosso par de chaves privado / público e protegê-lo no Cloud HSM. Receberemos acesso à chave pública, mas a chave privada permanecerá segura no Cloud HSM.

Naturalmente, como a chave privada nunca sai do Cloud HSM, você precisa usar as APIs oferecidas pelo Cloud KMS para cada operação que envolva o uso da chave privada. Em nosso caso, assinar nosso documento requer esse acesso e também assinar nossa solicitação de certificado.

Para usar essas tecnologias, você precisa de uma conta no GCP e precisa criar um projeto, instalar o Google Cloud SDK e fazer login com suas credenciais.

Como obter um par de chaves público / privado com o Cloud KMS

Isso é simples. Você pode usar o console do Google Cloud ou usar os comandos do gcloud . Você precisa primeiro criar um chaveiro (todas as chaves estão em um chaveiro); e depois diga ao Cloud KMS para criar um par de chaves neste chaveiro com o objetivo de "Sinal assimétrico". Para usar o Cloud HSM, definiremos o nível de proteção como 'hsm' . Você tem que escolher uma região para a chave, eu vou usar europe-west2, mas qualquer local disponível vai fazer.

A documentação completa está aqui . Usando a interface de linha de comando, seria

  1. Criando o chaveiro my-sign-ring :
 gcloud kms keyrings criam my-sign-ring  
--localização europe-west2

2. Criando a chave sleeksign no chaveiro. Note que especificamos que vamos usá-lo para assinatura assimétrica. Precisamos especificar o algoritmo que usaremos para assinar. Aqui nós selecionamos a chave RSA de 2048 bits PSS Padding – SHA256 Digest (isto é importante, ele terá que combinar com os algoritmos que nós realmente usamos mais tarde). Isso cria a versão 1 da chave.

Como vamos solicitar que as chaves sejam protegidas no HSM (especificando o nível de proteção), teremos que escolher um local onde o HSM esteja disponível. Por exemplo, europe-west2

 gcloud kms keys criar sleeksign  
--localização europe-west2
--expira assinatura assimétrica
- nível de proteção hsm
--default-algorithm RSA_SIGN_PSS_2048_SHA256

Agora temos um par de chaves na nuvem, que é protegido por um módulo de segurança de hardware.

Nós vamos precisar da chave pública , então vamos baixá-la em um arquivo local, que chamamos de sleek_signing_key.pub

 gcloud kms keys versions  
get-public-key 1
--localização europe-west2
- chaveiro-meu-anel-anel
- sleeksign chave
--output-file ~ /
sleek_signing_key.pub

Isso será usado para obter nosso certificado mais tarde.

Construindo o código Java do signatário do conteúdo

O principal truque aqui é garantir que nosso gerador de assinaturas criptográficas use a chave privada armazenada no Cloud KMS (e protegida pelo Cloud HSM).

O PDFBox delega tudo sobre criptografia à biblioteca BouncyCastle, incluindo assinatura digital, e o BouncyCastle tem várias interfaces predefinidas para assinatura, uma delas chamada ContentSigner . Então, para fazer uso do Cloud KMS. Vamos criar uma implementação da interface BouncyCastle ContentSigner que delegue para ela, e usá-la toda vez que precisarmos assinar algo do PDFBox.

Um ponto crucial é a escolha do identificador do algoritmo de assinatura. Ele precisa corresponder ao algoritmo que escolhemos para a chave . Os nomes usados pelo BouncyCastle não são exatamente idênticos aos nomes usados pelo Cloud KSM, mas há uma boa descrição dos algoritmos na documentação do Google Cloud e você deve ser capaz de combiná-los com relativa facilidade.

A primeira classe basicamente implementa a interface ContentSigner PDFBox delegando a uma classe de assinatura que lida com a conexão com o GCP e a chamada para as APIs apropriadas.

E aqui está a classe que essencialmente fornece um recurso de assinatura que se conecta ao GCP.

De agora em diante, toda vez que precisarmos criar uma assinatura, podemos criar uma instância dessa classe, passá-la para BouncyCastle como signatário e o código BouncyCastle delegará a ela conforme necessário.

É isso aí! Agora, conectamos o Google Cloud KMS e o Cloud HSM às bibliotecas de criptografia do BouncyCastle.

Vamos agora ao longo do restante do processo de obter nosso certificado e assinar documentos.

Obtendo um certificado: Solicitação de Assinatura de Certificado (CSR)

Conseguir um certificado para assinar nossos documentos é um passo fundamental. Nós partimos do nosso par de chaves.

  1. Crie um CSR ( Certificate Signing Request ), que contém essencialmente a chave pública que queremos certificar como nossa.
  2. Envie a solicitação para uma autoridade de certificação; depois, percorra as etapas de validação que eles exigem
  3. e finalmente receba nosso certificado.

Vamos fazer isso.

Já pedimos ao Cloud KMS para nos fornecer uma cópia da chave pública e armazená-la em um arquivo chamado sleek_signing_key.pub .

Para criar um CSR adequado, temos que criar um arquivo que apresente essa chave pública a uma autoridade de certificação juntamente com nossa identidade completa, formatada de acordo com a especificação PKCS # 10 e assinada com nossa chave privada. Desta forma, a autoridade de certificação pode validar que estamos solicitando um certificado para uma chave pública que realmente nos pertence.

Isso é complicado de se fazer manualmente. Mas podemos usar a classe JcaPKCS10CertificationRequestBuilder no BouncyCastle para fazer o trabalho para nós.

Tudo o que temos a fazer é escrever algumas linhas de código que leiam a chave pública e invoquem as funções de biblioteca adequadas, em um programa Java simples e autônomo. A assinatura será calculada usando a classe GoogleKMSContentSigner que criamos acima.

Isso produzirá conteúdo do CSR no console.

Depois de receber o CSR, podemos enviá-lo para nossa autoridade de certificação. Existem várias maneiras de fazer isso, dependendo de qual autoridade você escolheu.

Por fim, depois que sua solicitação for aprovada (o que pode levar tempo), você receberá um certificado brilhante (algumas CAs enviarão um arquivo .pem, outras usarão um formato diferente).

Assinando seus PDFs!

Agora que temos um par de chaves e um certificado, podemos finalmente assinar nossos arquivos PDF. Nosso aplicativo contém um serviço que cria a assinatura de um arquivo. Implementa um método de assinatura que leva o arquivo PDF a assinar como fluxo.

Aqui, novamente, delegaremos o cálculo real da assinatura ao Cloud KMS por meio de nossa classe GoogleKMSContentSigner

Estamos usando o Apache PDFBox como uma biblioteca para trabalhar com arquivos PDF. Abaixo do nosso código, baseado neste exemplo da fundação Apache.

Nota: usando um registro de data e hora fornecido por uma autoridade de registro de data e hora (TSA), também podemos afirmar que o certificado era válido no momento da assinatura – o que permite validar um documento mesmo que seu certificado tenha expirado. Esta não é a chave aqui, mas é útil saber.

Depois que o resumo assinado for retornado, a biblioteca do PDFBox o inserirá no arquivo PDF. Em última análise, salvamos o arquivo assinado em um intervalo do Google Cloud Storage .

Agora que o arquivo está assinado, qualquer um pode obter a assinatura, o certificado e a chave pública incorporados a ele e validar que o arquivo não foi adulterado.

Não foi tão difícil depois de tudo …

Pegadinhas comuns

Pode haver alguns desafios ao criar um produto de assinatura digital como fizemos.

O primeiro ponto a ter em mente é que a depuração pode ser difícil quando se trata de criptografia assimétrica e, especialmente, aproveitando um dispositivo HSM. Seu código parece funcionar e você ainda pode ter uma assinatura inválida. Nós batemos nossas cabeças contra a parede algumas vezes para entender onde estávamos errados. Aqui estão algumas dicas para assistir:

  • o algoritmo de chave privada, o algoritmo de certificado público e o algoritmo de CSR devem corresponder. Caso contrário, seu código será executado e os documentos serão assinados, mas você receberá uma mensagem criptografada de “assinatura inválida” ao abrir o documento.
  • a cadeia de certificados deve estar na ordem correta para validar corretamente.

Seja paciente, seja metódico.

O outro ponto importante é sobre o planejamento. Obter um Certificado de Assinatura de Documentos de uma das poucas CAs que estão na Lista de Confiança Aprovada da Adobe (AATL) exigiu muito tempo gasto na criação de e-mails e na execução de um processo em papel. Pode levar de alguns dias a algumas semanas entre o pedido de compra, a emissão do certificado de teste e a entrega do certificado real. Planeje seus lançamentos de acordo.

O último desafio para a emissão do certificado era poder fornecer à Autoridade de Certificação uma Solicitação de Assinatura de Certificado (CSR) apropriada, para que eles emitissem o certificado público. Levamos um pouco de pesquisando para entender como escrever um gerador de CSR que aproveitasse a API do Google KMS (recebemos nossa inspiração inicial desse )

E quanto a resiliência e backup de chaves privadas?

Por sua natureza, um HSM não libera informações de chave privada e, como conseqüência, a perda de um HSM significa a perda de todo o material de chave privada contido nele. Em um HSM tradicional, um backup completo do HSM é possível por meio de um token criptografado e de um protocolo específico definido pelo fabricante do HSM.

O Serviço do Google Cloud HSM é um serviço gerenciado, no qual você não precisa se preocupar com o gerenciamento de operações, como cluster, correção, dimensionamento … A resiliência da chave é garantida por um cluster de HSM real gerenciando sua chave e apenas um enorme a falha do cluster completo ao mesmo tempo exporá você à perda de sua chave privada.

Então, e se ainda acontecer? Uma maneira de gerenciar isso seria ter uma redundância de serviço, em diferentes regiões, para garantir que você nunca enfrentará uma interrupção de serviço. Essa alta disponibilidade teria um custo, pois você precisaria de dois conjuntos de chaves privadas, com dois certificados públicos emitidos pela sua autoridade de certificação. Você teria que equilibrar o custo de ter redundância versus o custo da perda do serviço por um período de tempo. No nosso caso, estamos selando documentos como uma operação em segundo plano, e achamos totalmente aceitável lidar com uma breve interrupção do serviço sem perda de dados.

Chaves e HSM

A segurança é uma das principais preocupações quando se trata de gerenciamento de chaves privadas, particularmente em um mundo de ameaças cibernéticas crescentes, e ficamos muito interessados no anúncio do lançamento do próprio HSM do Google em agosto de 2018. Tivemos uma visão profunda, mesmo quando a primeira versão da nossa assinatura eletrônica estava funcionando.

Ainda somos uma startup jovem, e achamos muito interessante ter acesso a um HSM como um serviço de commodity. Armazenar com segurança nossas chaves privadas sem colocar nosso orçamento em risco tornou-se um acéfalo!

Acreditamos que todas as empresas, e não apenas as startups, devem considerar seriamente o uso dessas tecnologias. Este é um caminho para uma troca de documentos melhor e mais segura e para a Internet. Os módulos de segurança de hardware, especialmente o Google Cloud HSM, devem fazer parte do seu kit de ferramentas.

Texto original em inglês.