

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

# Überprüfen der Signaturen von Amazon-SNS-Nachrichten
<a name="sns-verify-signature-of-message"></a>

Amazon SNS verwendet Nachrichtensignaturen, um die Echtheit von Nachrichten zu bestätigen, die an Ihren HTTP-Endpunkt gesendet werden. Um die Nachrichtenintegrität zu gewährleisten und Spoofing zu verhindern, **müssen** Sie die Signatur überprüfen, bevor Sie Amazon SNS SNS-Nachrichten verarbeiten.

**Wann sollten Sie Amazon SNS SNS-Signaturen überprüfen?**

Sie sollten Amazon SNS SNS-Nachrichtensignaturen in den folgenden Szenarien überprüfen:
+ Wenn Amazon SNS eine Benachrichtigung an Ihren HTTP (S) -Endpunkt sendet.
+ Wenn Amazon SNS nach einem [https://docs.aws.amazon.com/sns/latest/api/API_Unsubscribe.html](https://docs.aws.amazon.com/sns/latest/api/API_Unsubscribe.html)API-Aufruf eine Bestätigungsnachricht an Ihren Endpunkt sendet. [https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html](https://docs.aws.amazon.com/sns/latest/api/API_Subscribe.html)

**Amazon SNS unterstützt zwei Signaturversionen:**
+ SignatureVersion1 — Verwendet einen SHA1 Hash der Nachricht.
+ SignatureVersion2 — Verwendet einen SHA256 Hash der Nachricht. Dies bietet eine höhere Sicherheit und ist die empfohlene Option.

**Gehen Sie wie folgt vor, um die Signaturen von SNS-Nachrichten korrekt zu überprüfen:**
+ Rufen Sie das Signaturzertifikat immer über HTTPS ab, um unbefugte Abfangangriffe zu verhindern.
+ Vergewissern Sie sich, dass das Zertifikat von Amazon SNS ausgestellt wurde.
+ Vergewissern Sie sich, dass die Vertrauenskette des Zertifikats gültig ist.
+ Das Zertifikat sollte von einer SNS-signierten URL stammen.
+ Vertrauen Sie keinen in der Nachricht bereitgestellten Zertifikaten ohne Überprüfung.
+ Lehnen Sie alle Nachrichten mit einem unerwarteten Ergebnis ab`TopicArn`, um Spoofing zu verhindern.
+ Die AWS SDKs für Amazon SNS bieten eine integrierte Validierungslogik, wodurch das Risiko einer Fehlimplementierung reduziert wird.

# Konfiguration der Nachrichtensignaturversion zu Amazon SNS SNS-Themen
<a name="sns-verify-signature-of-message-configure-message-signature"></a>

Durch die Konfiguration der Nachrichtensignaturversion in Amazon SNS SNS-Themen können Sie die Sicherheit und Kompatibilität Ihres Nachrichtenüberprüfungsprozesses verbessern.

Wählen Sie zwischen `SignatureVersion` **1** (SHA1) und `SignatureVersion` **2** (SHA256), um den Hash-Algorithmus zu steuern, der zum Signieren von Nachrichten verwendet wird. Amazon SNS SNS-Themen sind standardmäßig auf `SignatureVersion` **1** eingestellt. Sie können diese Einstellung mithilfe der [https://docs.aws.amazon.com/sns/latest/api/API_SetTopicAttributes.html](https://docs.aws.amazon.com/sns/latest/api/API_SetTopicAttributes.html)API-Aktion konfigurieren.

Verwenden Sie das folgende Beispiel, um das Topic-Attribut `SignatureVersion` mithilfe von festzulegen AWS CLI:

```
aws sns set-topic-attributes \
    --topic-arn arn:aws:sns:us-east-2:123456789012:MyTopic \
    --attribute-name SignatureVersion \
    --attribute-value 2
```

# Überprüfung der Signatur einer Amazon SNS SNS-Nachricht bei Verwendung von abfragebasierten HTTP-Anfragen
<a name="sns-verify-signature-of-message-verify-message-signature"></a>

Die Überprüfung der Signatur einer Amazon SNS SNS-Nachricht bei Verwendung von HTTP-Abfragen gewährleistet die Authentizität und Integrität der Nachricht. Dieser Vorgang bestätigt, dass die Nachricht von Amazon SNS stammt und während der Übertragung nicht manipuliert wurde. Indem Sie die Nachricht analysieren, die richtige Zeichenfolge zum Signieren erstellen und die Signatur anhand eines vertrauenswürdigen öffentlichen Schlüssels validieren, schützen Sie Ihr System vor Spoofing und unbefugten Nachrichtenänderungen.

1. Extrahieren Sie **Schlüssel-Wert-Paare** aus dem JSON-Dokument im HTTP POST-Anforderungstext, der von Amazon SNS gesendet wurde. Diese Felder sind erforderlich, um die zu signierende **Zeichenfolge** zu erstellen.
   + `Message`
   + `Subject`(falls vorhanden)
   + `MessageId`
   + `Timestamp`
   + `TopicArn`
   + `Type`

   Beispiel:

   ```
   MESSAGE_FILE="message.json"
   FIELDS=("Message" "MessageId" "Subject" "Timestamp" "TopicArn" "Type")
   ```
**Anmerkung**  
Wenn ein Feld Escape-Zeichen enthält (z. B.`\n`), konvertieren Sie diese in ihre **ursprüngliche Form**, um eine exakte Übereinstimmung sicherzustellen.

1. Suchen Sie das `SigningCertURL` Feld in der Amazon SNS SNS-Nachricht. Dieses Zertifikat enthält den öffentlichen Schlüssel, der zur Überprüfung der Nachrichtensignatur benötigt wird. Beispiel:

   ```
   SIGNING_CERT_URL=$(jq -r '.SigningCertURL' "$MESSAGE_FILE")
   ```

1. Stellen Sie sicher, `SigningCertURL` dass das von einer vertrauenswürdigen AWS Domäne stammt (z. B.https://sns.us-east-1.amazonaws.com). Lehnen Sie aus Sicherheitsgründen alle URLs **externen AWS Domains** ab.

1. Laden Sie das **X.509-Zertifikat** von der angegebenen URL herunter. Beispiel:

   ```
   curl -s "$SIGNING_CERT_URL" -o signing_cert.pem
   ```

1. Extrahieren Sie den **öffentlichen Schlüssel** aus dem heruntergeladenen X.509-Zertifikat. Mit dem öffentlichen Schlüssel können Sie die Signatur der Nachricht entschlüsseln und ihre Integrität überprüfen. Beispiel:

   ```
   openssl x509 -pubkey -noout -in signing_cert.pem > public_key.pem
   ```

1. Verschiedene Nachrichtentypen erfordern unterschiedliche Schlüssel-Wert-Paare in der Zeichenfolge, um signiert zu werden. Identifizieren Sie den **Nachrichtentyp** (`Type`Feld in der Amazon SNS SNS-Nachricht), um zu bestimmen, welche **Schlüssel-Wert-Paare** eingeschlossen werden sollen:
   + **Benachrichtigungsnachricht** — Beinhaltet `Message``MessageId`,, `Subject` (falls vorhanden),`Timestamp`, `TopicArn` und. `Type`
   + **SubscriptionConfirmation**oder **UnsubscribeConfirmation Nachricht** — Beinhaltet `Message` `MessageId``SubscribeURL`,`Timestamp`,`Token`,`TopicArn`, und`Type`.

1. Amazon SNS verlangt, dass die Zeichenfolge signiert wird, um eine strikte, feste Reihenfolge zur Überprüfung einzuhalten. **Nur die ausdrücklich erforderlichen Felder müssen enthalten sein** — es können keine zusätzlichen Felder hinzugefügt werden. Optionale Felder, wie z. B.`Subject`, dürfen nur enthalten sein, wenn sie in der Nachricht enthalten sind, und müssen genau an der Position erscheinen, die durch die erforderliche Feldreihenfolge definiert ist. Beispiel:

   ```
   KeyNameOne\nValueOne\nKeyNameTwo\nValueTwo
   ```
**Wichtig**  
Fügen Sie am Ende der Zeichenfolge kein Zeilenumbruchzeichen hinzu.

1. Ordnen Sie die **Schlüssel-Wert-Paare** in Byte-Sortierreihenfolge an (alphabetisch nach dem Schlüsselnamen).

1. Konstruieren Sie die **zu signierende Zeichenfolge** mithilfe des folgenden Formatbeispiels:

   ```
   STRING_TO_SIGN=""
   for FIELD in "${FIELDS[@]}"; do
       VALUE=$(jq -r --arg field "$FIELD" '.[$field]' "$MESSAGE_FILE")
       STRING_TO_SIGN+="$FIELD\n$VALUE"
       # Append a newline after each field except the last one
       if [[ "$FIELD" != "Type" ]]; then
           STRING_TO_SIGN+="\n"
       fi
   done
   ```

   **Beispiel für eine Benachrichtigung:**

   ```
   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 Beispiel:**

   ```
   Message
   Please confirm your subscription
   MessageId
   3d891288-136d-417f-bc05-901c108273ee
   SubscribeURL
   https://sns.us-east-2.amazonaws.com/...
   Timestamp
   2024-01-01T00:00:00.000Z
   Token
   abc123...
   TopicArn
   arn:aws:sns:us-east-2:123456789012:MyTopic
   Type
   SubscriptionConfirmation
   ```

1. Das `Signature` Feld in der Nachricht ist Base64-codiert. **Sie müssen es **dekodieren**, um seine **rohe Binärform** mit dem abgeleiteten Hash zu vergleichen.** Beispiel:

   ```
   SIGNATURE=$(jq -r '.Signature' "$MESSAGE_FILE")
   echo "$SIGNATURE" | base64 -d > signature.bin
   ```

1. Verwenden Sie das `SignatureVersion` Feld, um den Hash-Algorithmus auszuwählen:
   + Verwenden Sie für `SignatureVersion` **1 **SHA1****(zum Beispiel`-sha1`).
   + Verwenden Sie für `SignatureVersion` **2 **SHA256****(zum Beispiel`-sha256`).

1. Um die Echtheit der Amazon SNS SNS-Nachricht zu bestätigen, generieren Sie einen **Hash** der erstellten Zeichenfolge und überprüfen Sie die Signatur mithilfe des **öffentlichen Schlüssels**.

   ```
   openssl dgst -sha256 -verify public_key.pem -signature signature.bin <<< "$STRING_TO_SIGN"
   ```

   Wenn die Signatur gültig ist, ist `Verified OK` die Ausgabe. Andernfalls ist die Ausgabe`Verification Failure`.

## Beispielskript mit Fehlerbehandlung
<a name="sns-verify-signature-of-message-example"></a>

Das folgende Beispielskript automatisiert den Überprüfungsprozess:

```
#!/bin/bash

# Path to the local message file
MESSAGE_FILE="message.json"

# Extract the SigningCertURL and Signature from the message
SIGNING_CERT_URL=$(jq -r '.SigningCertURL' "$MESSAGE_FILE")
SIGNATURE=$(jq -r '.Signature' "$MESSAGE_FILE")

# Fetch the X.509 certificate
curl -s "$SIGNING_CERT_URL" -o signing_cert.pem

# Extract the public key from the certificate
openssl x509 -pubkey -noout -in signing_cert.pem > public_key.pem

# Define the fields to include in the string to sign
FIELDS=("Message" "MessageId" "Subject" "Timestamp" "TopicArn" "Type")

# Initialize the string to sign
STRING_TO_SIGN=""

# Iterate over the fields to construct the string to sign
for FIELD in "${FIELDS[@]}"; do
    VALUE=$(jq -r --arg field "$FIELD" '.[$field]' "$MESSAGE_FILE")
    STRING_TO_SIGN+="$FIELD\n$VALUE"
    # Append a newline after each field except the last one
    if [[ "$FIELD" != "Type" ]]; then
        STRING_TO_SIGN+="\n"
    fi
done

# Verify the signature
echo -e "$STRING_TO_SIGN" | openssl dgst -sha256 -verify public_key.pem -signature <(echo "$SIGNATURE" | base64 -d)
```