Verificação das assinaturas de mensagens do Amazon SNS - Amazon Simple Notification Service

Verificação das assinaturas de mensagens do Amazon SNS

Para verificar a autenticidade de uma mensagem enviada ao seu endpoint HTTP pelo Amazon SNS, você pode verificar a assinatura da mensagem. Há dois casos em que recomendamos verificar a autenticidade da mensagem. Primeiro, quando o Amazon SNS envia uma mensagem ao seu endpoint HTTP informando que você se inscreveu em um tópico. Segundo, quando o Amazon SNS envia uma mensagem de confirmação ao seu endpoint HTTP após a execução das ações Subscribe ou Unsubscribe da API.

Você deve fazer o seguinte ao verificar mensagens enviadas pelo Amazon SNS:

  • Sempre use HTTPS ao obter o certificado do Amazon SNS.

  • Valide a autenticidade do certificado.

  • Verifique se o certificado foi recebido do Amazon SNS.

  • Quando possível, use um dos AWS SDKs compatíveis com o Amazon SNS para validar e verificar as mensagens.

  • Confirme se as mensagens do Amazon SNS foram recebidas do TopicArn desejado.

O Amazon SNS é compatível com duas versões de assinatura de mensagens:

  • SignatureVersion1: o Amazon SNS cria a assinatura com base no hash SHA1 da mensagem.

  • SignatureVersion1: o Amazon SNS cria a assinatura com base no hash SHA256 da mensagem.

Como configurar a versão da assinatura da mensagem nos tópicos do Amazon SNS

Por padrão, os tópicos do Amazon SNS usam SignatureVersion 1. Para selecionar o algoritmo de hash no tópico do Amazon SNS, SignatureVersion 1 (SHA1) ou SignatureVersion 2 (SHA256), você pode usar a ação SetTopicAttributes da API.

O exemplo de código a seguir mostra como definir o atributo do tópico SignatureVersion usando a AWS CLI:

aws sns set-topic-attributes \ --topic-arn arn:aws:sns:us-east-2:123456789012:MyTopic \ --attribute-name SignatureVersion \ --attribute-value 2
Para verificar a assinatura de uma mensagem do Amazon SNS ao usar solicitações baseadas em consulta HTTP
  1. Extraia os pares nome/valor do documento JSON no corpo da solicitação HTTP POST enviada pelo Amazon SNS para o endpoint. Você estará usando os valores de alguns dos pares de nome/valor para criar a string para assinar. Ao verificar a assinatura de uma mensagem do Amazon SNS, é fundamental que você converta os caracteres de controle de escape para suas representações de caracteres originais nos valores Message e Subject. Esses valores devem estar em seus formatos originais quando você os usa como parte da string para assinar. Para obter informações sobre como analisar o documento JSON, consulte Etapa 1: Verificar se o endpoint está pronto para processar mensagens do Amazon SNS.

    A SignatureVersion informa a versão da assinatura usada pelo Amazon SNS para gerar a assinatura da mensagem. A partir da versão da assinatura, você pode determinar os requisitos para gerar a assinatura. Para notificações, no momento o Amazon SNS é compatível com a versão de assinatura 1 e 2. Esta seção apresenta as etapas para a verificação de uma assinatura usando essas versões de assinatura.

  2. Obtenha o certificado X509 usado pelo Amazon SNS para assinar a mensagem. O valor SigningCertURL aponta para a localização do certificado X509 usado para criar a assinatura digital da mensagem. Recupere o certificado nesse local.

  3. Extraia a chave pública do certificado. A chave pública do certificado especificado por SigningCertURL é usada para verificar a autenticidade e a integridade da mensagem.

  4. Determinar o tipo de mensagem. O formato de string a ser assinada depende do tipo de mensagem, que é especificado pelo valor Type.

  5. Crie a string para assinar. A string a ser assinada é uma lista delimitada por caracteres de nova linha composta por pares de nome-valor específicos da mensagem. Cada par de nome/valor é representado pelo nome seguido por um caractere de nova linha, seguido pelo valor e terminando com um caractere de nova linha. Os pares de nome/valor devem ser listados em ordem de classificação por bytes.

    Dependendo do tipo de mensagem, a string para assinar deve ter os seguintes pares de nome/valor.

    Notificação

    As mensagens de notificação devem conter os seguintes pares de nome/valor:

    Message MessageId Subject (if included in the message) Timestamp TopicArn Type

    O exemplo a seguir é uma string para assinar para uma Notification.

    Message My Test Message MessageId 4d4dc071-ddbf-465d-bba8-08f81c89da64 Subject My subject Timestamp 2019-01-31T04:37:04.321Z TopicArn arn:aws:sns:us-east-2:123456789012:s4-MySNSTopic-1G1WEFCOXTC0P Type Notification
    SubscriptionConfirmation e UnsubscribeConfirmation

    Mensagens de SubscriptionConfirmation e UnsubscribeConfirmation devem conter os seguintes pares de nome/valor:

    Message MessageId SubscribeURL Timestamp Token TopicArn Type

    O exemplo a seguir é uma string para assinar para uma SubscriptionConfirmation.

    Message My Test Message MessageId 3d891288-136d-417f-bc05-901c108273ee SubscribeURL https://sns.us-east-2.amazonaws.com/?Action=ConfirmSubscription&TopicArn=arn:aws:sns:us-east-2:123456789012:s4-MySNSTopic-1G1WEFCOXTC0P&Token=233... Timestamp 2019-01-31T19:25:13.719Z Token 233... TopicArn arn:aws:sns:us-east-2:123456789012:s4-MySNSTopic-1G1WEFCOXTC0P Type SubscriptionConfirmation
  6. Decodifique o valor Signature do formato Base64. A mensagem oferece a assinatura no valor Signature, que é codificado como Base64. Antes de comparar o valor da assinatura com a assinatura que você calculou, certifique-se de decodificar o valor Signature do Base64 para comparar os valores usando o mesmo formato.

  7. Gere o valor de hash derivado da mensagem do Amazon SNS. Envie a mensagem do Amazon SNS, no formato canônico, ao mesmo algoritmo de hash usado para gerar a assinatura.

    1. Se a SignatureVersion for 1, use SHA1 como o algoritmo de hash.

    2. Se o SignatureVersion for 2, use SHA256 como o algoritmo de hash.

  8. Gere o valor de hash declarado da mensagem do Amazon SNS. O valor de hash declarado é o resultado de usar o valor de chave pública (da etapa 3) para decodificar a assinatura entregue com a mensagem do Amazon SNS.

  9. Verifique a autenticidade e a integridade da mensagem do Amazon SNS. Compare o valor de hash derivado (da etapa 7) com o valor de hash declarado (da etapa 8). Se os valores forem idênticos, o destinatário poderá ter certeza de que a mensagem não foi modificada durante a transferência e que deve ter origem no Amazon SNS. Se os valores não forem idênticos, ela não deve ser confiável para o destinatário.