For the complete documentation index, see llms.txt. This page is also available as Markdown.

Assinatura

Visão geral

Este documento fornece orientações sobre assinaturas de mensagens de webhook e como validar o X-Caf-Signature cabeçalho incluído em todas as solicitações de webhook feitas pelos serviços da Certta.

Assinaturas de mensagens

Como as URLs de webhook ficam expostas à internet, sua aplicação precisa de um mecanismo seguro para verificar se as solicitações realmente vêm da Certta. Implementamos um cabeçalho de validação de assinatura para esse propósito, que chamamos de assinatura da mensagem.

Cabeçalho de assinatura

Cada solicitação de webhook inclui um X-Caf-Signature cabeçalho com o seguinte formato:

X-Caf-Signature: 5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd

O cabeçalho contém o valor da assinatura HMAC SHA-256 gerado a partir do corpo bruto da solicitação usando seu segredo de cliente.

Como validar

A Certta implementa um mecanismo de código de autenticação de mensagem por hash com chave (HMAC) com SHA256 para gerar uma assinatura para cada mensagem enviada, com a codificação final em hexadecimal.

Essa assinatura é gerada usando o segredo de cliente da sua aplicação (o mesmo usado para gerar tokens), encontrado no Trust, a plataforma que gerencia as configurações. A assinatura é enviada por meio do X-Caf-Signature cabeçalho em cada HTTP solicitação.

Para validar essa assinatura, sua integração deve:

  1. Gerar o HMAC da mensagem recebida usando seu segredo (armazenado em um local seguro)

  2. Compará-lo com a assinatura recebida usando um algoritmo de comparação segura

Considerações importantes de segurança

Como campos podem ser adicionados a qualquer evento a qualquer momento sem que isso represente uma mudança incompatível, a validação da mensagem deve ser feita antes que o conteúdo seja transformado em um objeto de linguagem. Isso significa usar o array de bytes do corpo "como está" para gerar a assinatura de comparação, sem qualquer transformação.

Isso também é importante porque, ao lidar com JSONs, {"prop1": "value1", "prop2": "value2"} é equivalente a {"prop2": "value2", "prop1": "value1"} para parsers/encoders, já que a ordem das propriedades não faz parte de uma JSON definição, mas os arrays de bytes formados pelos dois objetos são diferentes. Além disso, alguns caracteres podem ser codificados de forma diferente dependendo da biblioteca ou da linguagem utilizada.

Exemplos de implementação

Muitas linguagens de programação incluem implementações seguras de HMAC em suas bibliotecas padrão:

Variações de formato

Todos esses exemplos são válidos para o mesmo JSON, mas com formatações diferentes, e sua integração deve oferecer suporte a todos eles:

Sem espaços ou quebras de linha

O X-Caf-Signature o valor é calculado a partir desses bytes exatos e do segredo do seu webhook.

Com espaços, sem quebras de linha

Embora esse JSON represente o mesmo objeto, sua assinatura é diferente porque seus bytes brutos são diferentes.

Com espaços e quebras de linha

Esse corpo formatado também produz uma assinatura diferente.

Com propriedades em ordem diferente

Alterar a ordem das propriedades também altera a assinatura.

Exemplos de código

Node.js

Java

Go

Melhores práticas de segurança

Obtendo seu segredo de webhook

Você pode encontrar seu segredo de webhook no Trust, a plataforma que gerencia as configurações, nas definições de configuração do webhook. Se você acredita que seu segredo foi comprometido, você pode gerar um novo a qualquer momento.

Atualizado