Durch die Nutzung von AWS re:Post stimmt du den AWS re:Post Nutzungsbedingungen

Wie behebe ich Probleme mit einer signierten URL oder signierten Cookies in CloudFront?

Lesedauer: 7 Minute
0

Ich verwende Amazon CloudFront und eine signierte URL oder signierte Cookies, um private Inhalte zu sichern. Ich erhalte die Fehlermeldung „403 Access Denied“.

Lösung

Wenn Amazon CloudFront auf ein Problem mit einer signierten URL oder signierten Cookies stößt, erhalten Sie möglicherweise den Fehler 403 Access Denied.

Eine signierte URL oder ein signiertes Cookie enthält nicht den richtigen Signer

Wenn Sie in einem Verhalten die Option Restrict Viewer Access aktivieren, müssen Sie einen Signer festlegen. Ein Signer ist entweder eine vertrauenswürdige Schlüsselgruppe, die Sie in CloudFront erstellen, oder ein AWS-Konto, das ein CloudFront-Schlüsselpaar enthält. Die folgenden 403-Fehlermeldungen weisen darauf hin, dass die Signer-Informationen fehlen oder falsch sind:

Der Fehler beinhaltet die Meldung „Missing Key-Pair-Id query parameter or cookie value".

Diese Meldung weist auf einen fehlenden oder leeren Key-Pair-Id-Abfrageparameter mit einer signierten URL hin. Oder sie weist auf einen fehlenden CloudFront-Key-Pair-Id-Abfragezeichenfolgenparameter in einem signierten Cookie hin.

Der Fehler beinhaltet die Meldung „Unknown Key“.

Diese Meldung weist darauf hin, dass CloudFront die Signer-Informationen nicht anhand der Key-Pair-Id für signierte URLs oder der CloudFront-Key-Pair-Id für signierte Cookies überprüfen kann.

Um dieses Problem zu beheben, vergewissern Sie sich, dass der richtige Key-Pair-Id-Wert für eine signierte URL bzw. der richtige CloudFront-Key-Pair-Id-Wert für signierte Cookies verwendet wird:

Wenn Sie eine signierte URL verwenden, ermitteln und notieren Sie sich den Wert der Key-Pair-Id.
– oder –
Wenn Sie signierte Cookies verwenden, ermitteln und notieren Sie sich den Wert der CloudFront-Key-Pair-Id.

Sehen Sie dann die Schlüssel-ID nach und stellen Sie sicher, dass sie mit der Key-Pair-Id oder CloudFront-Key-Pair-Id übereinstimmt:

  1. Öffnen Sie die CloudFront-Konsole. Wählen Sie im Navigationsmenü Distributions aus.
  2. Wählen Sie Ihre Distribution aus. Wählen Sie die Registerkarte Behaviors aus.
  3. Wählen Sie den Namen des Verhaltens aus und klicken Sie auf Edit.
  4. Suchen Sie nach der Einstellung Restrict viewer access.
    Hinweis: Wenn sie auf Yes gesetzt ist, müssen Anfragen nach Dateien, die dem Pfadmuster des Cache-Verhaltens entsprechen, die signierte URL oder das signierte Cookie verwenden.
  5. Markieren Sie das Feld Trusted authorization type.
  6. Wenn unter Trusted authorization type der Wert Trusted key groups eingestellt ist, notieren Sie sich den Namen der vertrauenswürdigen Schlüsselgruppe. Ermitteln Sie die öffentlichen Schlüssel-IDs für die vertrauenswürdige Schlüsselgruppe:
    Öffnen Sie die CloudFront-Konsole.
    Wählen Sie Key Groups. Wählen Sie den Namen der vertrauenswürdigen Schlüsselgruppe aus, die Sie notiert haben.
    Vergewissern Sie sich, dass der Wert für Key-Pair-Id oder CloudFront-Key-Pair-Id mit einer der öffentlichen Schlüssel-IDs in der vertrauenswürdigen Schlüsselgruppe übereinstimmt.
  7. Wenn unter Trusted authorization als Wert Trusted Signer ausgewählt ist, verwendet CloudFront die von AWS generierten Anmeldeinformationen. In diesem Fall muss der Wert für Key-Pair-Id oder CloudFront-Key-Pair-Id mit der Zugriffsschlüssel-ID der CloudFront-Anmeldeinformationen übereinstimmen.
    Hinweis: Um die Zugriffsschlüssel-ID der CloudFront-Anmeldeinformationen zu finden, siehe Create key pairs for your signers.

Eine signierte URL oder ein signiertes Cookie wird nicht zu einem gültigen Zeitpunkt gesendet

Wenn Sie eine signierte URL oder ein signiertes Cookie erstellen, spezifiziert eine Richtlinienanweisung im JSON-Format die Einschränkungen für die signierte URL. Diese Anweisung bestimmt, wie lange die URL gültig ist. CloudFront gibt in den folgenden Szenarien den Fehler 403 Access Denied zurück:

Hinweis: Die Werte Expires, CloudFront-Expires, DateLessThan und DateGreaterThan sind im Unix-Zeitformat in Sekunden und koordinierter Weltzeit (UTC) angegeben. Beispiel: Der 1. Januar 2013, 10:00 Uhr UTC, wird im Unix-Zeitformat in 1357034400 konvertiert. Wenn Sie Epochenzeit verwenden, nutzen Sie eine 32-Bit-Ganzzahl für ein Datum, das nicht später als 2147483647 (19. Januar 2038, 03:14:07 Uhr UTC) liegt.

Der Policy-Parameter in einer signierten URL oder das CloudFront-Policy-Attribut in einem signierten Cookie gibt an, dass Sie eine benutzerdefinierte Richtlinie verwenden. Die Richtlinienanweisung liegt im JSON-Format vor und ist base64-kodiert. Verwenden Sie einen base64-Dekodierungsbefehl, um den Wert von DateLessThan oder DateGreaterThan herauszufinden.

Beispiel für eine base64-kodierte benutzerdefinierte Richtlinie:

eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__

Um eine benutzerdefinierte Richtlinie im base64-kodierten Format in das JSON-Format zu dekodieren, führen Sie den folgenden Linux-Befehl aus. Ersetzen Sie den Richtlinienwert durch Ihren benutzerdefinierten Richtlinienwert:

echo "eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__" | tr -- '-_~' '+=/' | base64 -d

Sie erhalten eine Ausgabe, die dem folgenden Beispiel ähnelt:

{ "Statement": [{ "Resource": "http://d111111abcdef8.cloudfront.net/game_download.zip", "Condition": { "IpAddress": { "AWS:SourceIp": "192.0.2.0/24" }, "DateLessThan": { "AWS:EpochTime": 1426500000 } } }] }

Eine signierte URL oder ein signiertes Cookie enthält mehr als eine Anweisung in der Richtlinie

Wenn in einer vordefinierten oder benutzerdefinierten Richtlinie mehrere Anweisungen enthalten sind, gibt CloudFront den Fehler 403 Access Denied zurück.

Um dieses Problem zu beheben, überprüfen Sie die benutzerdefinierte Richtlinienanweisung anhand des Linux-Befehls im vorangehenden Abschnitt. Überprüfen Sie Ihre Codedetails und vergewissern Sie sich, dass in der vordefinierten Richtlinie oder der benutzerdefinierten Richtlinie nur eine Anweisung enthalten ist.

Eine signierte URL oder ein signiertes Cookie hat eine falsche Basis-URL in der Richtlinie

CloudFront gibt den Fehler 403 Access Denied zurück, wenn die Basis-URL in der Richtlinie falsch ist:

  • Sie ist im Ressourcenschlüssel (www.beispiel.de) abgekürzt. Verwenden Sie eine vollständige URL (http://www.beispiel.de).
  • Es ist keine UTF-8-Zeichenkodierung vorhanden.
  • Sie enthält nicht sämtliche Interpunktion und Parameternamen.
  • Das HTTP- oder HTTPS-Protokoll entspricht nicht dem Protokoll, das in einer Anfrage verwendet wird, die eine signierte URL oder signierte Cookies sendet.
  • Der Domainname stimmt nicht mit dem Host-Header überein, den der Benutzeragent verwendet, um eine signierte URL oder signierte Cookies zu senden.
  • Die Abfragezeichenfolge enthält ungültige Zeichen.

Eine signierte URL oder ein signiertes Cookie enthält eine falsche Signatur in der Richtlinie

CloudFront gibt in den folgenden Szenarien den Fehler 403 Access Denied zurück:

  • Die Richtlinienanweisung enthält Leerzeichen, einschließlich Tabulatoren und Zeilenumbruchzeichen.
  • Die vordefinierte oder benutzerdefinierte Richtlinie wird nicht als Zeichenfolge formatiert, bevor sie gehasht wird. Dies passiert, wenn Sie eine signierte URL oder ein signiertes Cookie ohne ein AWS SDK erstellen.
  • Die Richtlinie wird nicht gehasht, bevor sie die Signatur generiert. Dies passiert, wenn Sie die signierte URL oder das signierte Cookie ohne ein AWS SDK erstellen.

Bewährte Methoden für Signaturen bei Verwendung einer signierten URL oder signierter Cookies finden Sie unter Code examples for creating a signature for a signed URL.

Eine signierte URL oder ein signiertes Cookie wurde von einer nicht unterstützten IP-Adresse oder einem nicht unterstützten IP-Bereich gesendet

CloudFront gibt den Fehler 403 Access Denied zurück, wenn eine signierte URL oder ein signiertes Cookie von einer IPv6-Adresse gesendet wird. Oder sie/es wird von einer IPv4-Adresse oder einem IPv4-Bereich gesendet, der in der benutzerdefinierten Richtlinie nicht zulässig ist.

Der IpAddress-Schlüssel ist nur in der benutzerdefinierten Richtlinie verfügbar, die sich in einer signierten URL oder einem signierten Cookie befindet. IP-Adressen im IPv6-Format werden nicht unterstützt. Wenn Sie eine benutzerdefinierte Richtlinie verwenden, die IpAddress enthält, aktivieren Sie für die Distribution nicht IPv6.

Ein signiertes Cookie enthält nicht die Domain- und Path-Attribute in den Set-Cookie-Antwortheadern

CloudFront gibt den Fehler 403 Access Denied zurück, wenn Cookies von CloudFront zurückkehren, aber nicht in späteren Anfragen an dieselbe Domain enthalten sind. Überprüfen Sie in diesem Fall die Cookie-Attribute Domain und Path im Set-Cookie-Antwortheader.

Der Wert Domain ist der Domainname für die angeforderte Datei. Wenn Sie kein Domain-Attribut angeben, ist der Standardwert der Domainname in der URL. Dies gilt nur für den angegebenen Domainnamen, nicht für Subdomains. Wenn Sie ein Domain-Attribut angeben, gilt es auch für Subdomains.

Wenn Sie ein Domain-Attribut angeben, müssen der Domainname in der URL und der Wert des Domain-Attributs übereinstimmen. Sie können den Domainnamen angeben, den CloudFront Ihrer Distribution zuweist, z. B. d111111abcdef8.cloudfront.net. Sie können jedoch nicht***.cloudfront.net** als Domainnamen angeben. Um einen alternativen Domainnamen wie beispiel.de zu verwenden, fügen Sie Ihrer Distribution in Ihren URLs einen alternativen Domainnamen hinzu.

Das Path-Attribut ist der Pfad für die angeforderte Datei. Wenn Sie kein Path-Attribut angeben, ist der Standardwert der Pfad in der URL.

AWS OFFICIAL
AWS OFFICIALAktualisiert vor einem Jahr