Autenticação

A autenticação para emissão do certificado utilizará o protocolo HMAC para envio de mensagens JSON. Objetivo: permitir a comunicação entre um Cliente e o Servidor com segurança.

Nonce

O número nonce deve ser composto por uma parte pseudoaleatória com 4 (quatro) números concatenada com o timestamp (Unix Timestamparrow-up-right sem microssegundos).

O Servidor sempre irá verificar se o nonce1 enviado pelo Cliente na requisição está dentro de uma margem de tolerância em relação ao relógio do Servidor. Se o timestamp do nonce1 estiver fora dessa margem o Servidor irá recusá-lo e enviar uma mensagem de erro NONCE fora do intervalo esperado.

O Cliente também deve verificar se o nonce2 enviado pelo Servidor na resposta da requisição está dentro da margem de tolerância. No nonce1 27031597863865, por exemplo, 2703 é a parte pseudoaleatória e 1597863865 é o UNIX timestamp (19 de Agosto de 2020 19:04:25 UTC/GMT).

HMAC

O protocolo HMAC prevê comunicação sem sessão para mensagens imunes a ataques de replay (valida-dados-emissao e recuperar-certificado) e comunicação com sessão para transações sensíveis a ataque de replay (emitir-certificado).

O Servidor define o algoritmo de hasharrow-up-right H() a ser utilizado para cálculo do HMAC. Recomendamos SHA256 ou superior.

Cliente e Servidor devem utilizar a mesma chave keypara cálculo do HMAC. Essa chave deve ter tamanho e entropia suficiente para desestimular ataques de força bruta e de dicionário.

circle-info

A key utilizada será a senha de emissão do Certificado Digital. Senha na qual o cliente cadastrou no momento da solicitação do certificado.

O hmac de cada mensagem é calculado da seguinte forma:

hmac=H(H(hkey)m)hmac = H ( H ( hkey ) || m )

H() : algoritmo de hash hkey : chave utilizada para o cálculo || : concatenação de strings m : mensagem

A chave hkey é definida de três formas diferentes:

hkey=nonce1keyhkey = nonce1 ║ key

nonce1 : Nonce enviado pelo Cliente key : Senha de emissão do Certificado

circle-info

Essa primeira forma é utilizada para mensagens sem sessão e para a mensagem de abertura de sessão enviada pelo Cliente.

hkey=nonce1keynonce2hkey=nonce1║key║nonce2

nonce1 : Nonce enviado pelo Cliente key : Senha de emissão do Certificado nonce2 : Nonce enviado pelo Servidor

circle-info

Essa segunda forma é utilizada somente para a mensagem de confirmação de abertura de sessão enviada pelo Servidor.

hkey=nonce1keycnonce2hkey=nonce1║key║c║nonce2

nonce1 : Nonce enviado pelo Cliente key : Senha de emissão do Certificado c : Contador de mensagem nonce2 : Nonce enviado pelo Servidor

circle-info

Essa terceira forma é utilizada em todas as mensagens após a abertura de sessão e considera a numeração das mensagens. O Servidor ao responder à mensagem 1, terá c também definido como 1.

Mensagens em JSON

Por questões de compatibilidade, a mensagem JSON deve obedecer aos seguintes critérios:

  • Não deve conter espaços desnecessários (por exemplo, espaços e quebras de linha entre os elementos do JSON).

  • Os nomes/descritores dos elementos devem estar entre aspas duplas.

  • Os valores dos elementos também devem estar entre aspas duplas.

  • Apenas valores numéricos (inteiros ou de ponto flutuante) podem estar sem as aspas duplas.

HMAC sem sessão

Para serviços sem sessão, o fluxo será:

  1. Requisição: O Cliente envia por POST para a URL do serviço os seguintes campos:

    1. mensagem: mensagem JSON para o Servidor

    2. hmac: HMAC calculado pelo Cliente

    3. nonce1: Nonce gerado pelo Cliente

  2. Resposta: O Servidor gera como resposta um JSON com dois elementos:

    1. mensagem: resposta JSON para o Cliente

    2. hmac : HMAC calculado pelo Servidor

circle-info

Se ocorrer algum erro, a mensagem gerada pelo servidor será um JSON com apenas o elemento erro, que por sua vez terá dois elementos: codigo (código do erro) e mensagem (descrição do erro). O hmac será calculado pelo servidor sobre essa mensagem de erro.

Exemplo de comunicação sem sessão

Requisição do Cliente

Exemplo de resposta do Servidor

Resposta válida

Resposta de erro

HMAC com sessão

O Cliente deve iniciar a sessão através de uma comunicação hmac sem sessão. O Servidor enviará na confirmação de abertura de sessão um ou mais cookies de identificação da sessão. O Cliente deve enviar esses cookies em todas as requisições da sessão.

Na abertura da sessão o Cliente enviará o nonce1, e o Servidor enviará na confirmação de abertura de sessão o nonce2. Cliente e o Servidor usarão esses mesmos nonce1 e nonce2 para calcular o hmac de todas mensagens posteriores à abertura da sessão.

Na comunicação hmac com sessão, as mensagens são numeradas. A primeira mensagem enviada pelo Cliente ao Servidor após a abertura da sessão é a mensagem número 1. Cliente e Servidor devem manter a contagem das mensagens, mas sem transmitir o número da mensagem.

O fluxo de mensagens com sessão será:

  1. Requisição de abertura de sessão: O Cliente envia por POST para a URL do serviço os seguintes campos:

    1. mensagem: {"session":"Sinerg_HMAC_Session_Request"}

    2. hmac: HMAC calculado pelo Cliente

    3. nonce1: Nonce gerado pelo Cliente

  2. Resposta de abertura de sessão: O Servidor gera como resposta um JSON com três elementos:

    1. mensagem: {"session":"Sinerg_HMAC_Session_Response"}

    2. hmac: HMAC calculado pelo Servidor

    3. nonce2: Nonce gerado pelo Servidor

  3. Requisição #1: O Cliente envia por POST para a URL do serviço :

    1. mensagem: mensagem JSON para o Servidor

    2. hmac: HMAC calculado pelo Cliente

    3. nonce1: Nonce gerado pelo Cliente

  4. Resposta #1: O Servidor gera como resposta um JSON com dois elementos:

    1. mensagem: resposta JSON para o cliente

    2. hmac : HMAC calculado pelo Servidor

  5. Requisição #n: O Cliente envia por POST para a URL do serviço :

    1. mensagem: mensagem JSON para o Servidor

    2. hmac: HMAC calculado pelo Cliente

    3. nonce1: Nonce gerado pelo Cliente

  6. Resposta #n: O Servidor gera como resposta um JSON com dois elementos:

    1. mensagem: resposta JSON para o Cliente

    2. hmac : HMAC calculado pelo Servidor

circle-info

Após a abertura de sessão o Servidor enviará os cookies de identificação de sessão, eles devem ser enviados a cada requisição.

Exemplo de comunicação com sessão

Requisição do Cliente

Servidor confirma abertura de sessão

circle-info

Cookie enviado pelo Servidor: PHPSESSID=4ca595a215510028bbf48dd9ad29f24e

Cliente envia requisição #1

circle-info

Cookie enviado pelo Cliente: PHPSESSID=4ca595a215510028bbf48dd9ad29f24e

Servidor responde à requisição #1

Serviços auxiliareschevron-right

Last updated

Was this helpful?