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:
-
SignatureVersion
1: o Amazon SNS cria a assinatura com base no hash SHA1 da mensagem. -
SignatureVersion
1: 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
-
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
eSubject
. 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. -
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. -
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. -
Determinar o tipo de mensagem. O formato de string a ser assinada depende do tipo de mensagem, que é especificado pelo valor
Type
. -
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
eUnsubscribeConfirmation
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 Token233...
TopicArn arn:aws:sns:us-east-2:123456789012:s4-MySNSTopic-1G1WEFCOXTC0P Type SubscriptionConfirmation
-
Decodifique o valor
Signature
do formato Base64. A mensagem oferece a assinatura no valorSignature
, que é codificado como Base64. Antes de comparar o valor da assinatura com a assinatura que você calculou, certifique-se de decodificar o valorSignature
do Base64 para comparar os valores usando o mesmo formato. -
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.
-
Se a
SignatureVersion
for 1, use SHA1 como o algoritmo de hash. -
Se o
SignatureVersion
for 2, use SHA256 como o algoritmo de hash.
-
-
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.
-
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.