

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.

# Stellen Sie private Inhalte mit signierten URLs und signierten Cookies bereit
<a name="PrivateContent"></a>

Viele Unternehmen, die Inhalte über das Internet verteilen, möchten den Zugriff auf Dokumente, geschäftliche Daten, Medien-Streams oder Inhalte für ausgewählte Benutzer (z. B. Benutzer, die eine Gebühr bezahlt haben) einschränken. Um diesen privaten Inhalt mithilfe von sicher bereitzustellen CloudFront, können Sie Folgendes tun:
+ Erfordern Sie, dass Ihre Benutzer mithilfe spezieller CloudFront signierter URLs oder signierter Cookies auf Ihre privaten Inhalte zugreifen. 
+ Erfordern Sie, dass Ihre Benutzer auf Ihre Inhalte zugreifen CloudFront URLs, indem sie Inhalte verwenden, nicht URLs direkt auf dem Ursprungsserver (z. B. Amazon S3 oder einen privaten HTTP-Server) zugreifen. Eine Anforderung CloudFront URLs ist nicht erforderlich, wir empfehlen es jedoch, um zu verhindern, dass Benutzer die Einschränkungen umgehen, die Sie in signierten URLs oder signierten Cookies angeben.

Weitere Informationen finden Sie unter [Beschränken des Zugriffs auf Dateien](private-content-overview.md).

## So können Sie private Inhalte bereitstellen
<a name="private-content-task-list"></a>

Gehen Sie wie folgt vor, CloudFront um die Bereitstellung privater Inhalte zu konfigurieren:

1. (Optional, aber empfohlen) Erfordern Sie, dass Ihre Benutzer nur über auf Ihre Inhalte zugreifen CloudFront. Die dafür verwendete Methode hängt davon ab, ob Sie Amazon S3 oder benutzerdefinierte Ursprünge verwenden:
   + **Amazon S3** – Siehe [Beschränken des Zugriffs auf einen Amazon-S3-Ursprung](private-content-restricting-access-to-s3.md).
   + **Benutzerdefinierter Ursprung** – Siehe [Beschränken des Zugriffs auf Dateien auf benutzerdefinierten Ursprungsservern](private-content-overview.md#forward-custom-headers-restrict-access).

   Zu den benutzerdefinierten Ursprüngen gehören Amazon EC2, Amazon S3-Buckets, die als Website-Endpunkte konfiguriert sind, Elastic Load Balancing und Ihre eigenen HTTP-Webserver.

1. Geben Sie die *vertrauenswürdigen Schlüsselgruppen* oder *vertrauenswürdigen Unterzeichner* an, die Sie verwenden möchten, um signierte URLs oder signierte Cookies zu erstellen. Es wird empfohlen, vertrauenswürdige Schlüsselgruppen zu verwenden. Weitere Informationen finden Sie unter [Geben Sie Unterzeichner an, die signierte URLs und signierte Cookies erstellen können](private-content-trusted-signers.md).

1. Schreiben Sie Ihre Anwendung so, dass sie auf Anfragen von autorisierten Benutzern entweder mit signierten URLs oder mit `Set-Cookie` Headern reagiert, die signierte Cookies setzen. Befolgen Sie die Schritte auf einem der folgenden Themen: 
   + [Verwenden Sie signierte URLs](private-content-signed-urls.md)
   + [Verwenden signierter Cookies](private-content-signed-cookies.md)

   Wenn Sie sich nicht sicher sind, welche Methode Sie verwenden sollen, lesen Sie nach unter [Entscheiden Sie sich dafür, signierte URLs oder signierte Cookies zu verwenden](private-content-choosing-signed-urls-cookies.md).

**Topics**
+ [So können Sie private Inhalte bereitstellen](#private-content-task-list)
+ [Beschränken des Zugriffs auf Dateien](private-content-overview.md)
+ [Geben Sie Unterzeichner an, die signierte URLs und signierte Cookies erstellen können](private-content-trusted-signers.md)
+ [Entscheiden Sie sich dafür, signierte URLs oder signierte Cookies zu verwenden](private-content-choosing-signed-urls-cookies.md)
+ [Verwenden Sie signierte URLs](private-content-signed-urls.md)
+ [Verwenden signierter Cookies](private-content-signed-cookies.md)
+ [Linux-Befehle und OpenSSL für die Base64-Codierung und die Verschlüsselung](private-content-linux-openssl.md)
+ [Code-Beispiele für das Erstellen einer Signatur für eine signierte URL](PrivateCFSignatureCodeAndExamples.md)

# Beschränken des Zugriffs auf Dateien
<a name="private-content-overview"></a>

Sie können den Benutzerzugriff auf Ihre privaten Inhalte auf zwei Arten steuern:
+ [Beschränken Sie den Zugriff auf Dateien in CloudFront Caches](#private-content-overview-edge-caches).
+ Beschränken Sie den Zugriff auf Dateien auf Ihrem Ursprungsserver, indem Sie einen der folgenden Schritte ausführen:
  + [Richten Sie eine Ursprungszugriffssteuerung (OAC) für Ihren Amazon-S3-Bucket ein](private-content-restricting-access-to-s3.md).
  + [Konfigurieren Sie benutzerdefinierte Header für einen privaten HTTP-Server (ein benutzerdefinierter Ursprung)](#forward-custom-headers-restrict-access).

## Beschränken Sie den Zugriff auf Dateien in Caches CloudFront
<a name="private-content-overview-edge-caches"></a>

Sie können festlegen CloudFront , dass Benutzer entweder mit *signierten URLs oder signierten* *Cookies* auf Ihre Dateien zugreifen müssen. Anschließend entwickeln Sie Ihre Anwendung, um entweder signierte Benutzer zu erstellen und URLs an authentifizierte Benutzer zu verteilen oder um `Set-Cookie` Header zu senden, die signierte Cookies für authentifizierte Benutzer setzen. (Um einigen Benutzern langfristigen Zugriff auf eine kleine Anzahl von Dateien zu gewähren, können Sie signierte URLs Dateien auch manuell erstellen.) 

Wenn Sie signierte URLs oder signierte Cookies erstellen, um den Zugriff auf Ihre Dateien zu kontrollieren, können Sie die folgenden Einschränkungen festlegen:
+ Ein Enddatum und eine Endzeit, nach welchen die URL nicht mehr gültig ist. 
+ (Optional) Das Datum und die Zeit, an welchen die URL gültig wird.
+ (Optional) Die IP-Adresse oder der IP-Adressbereich der Computer, die für den Zugriff auf Ihre Inhalte verwendet werden können. 

Ein Teil einer signierten URL oder eines signierten Cookies wird gehasht und mit dem privaten Schlüssel von einem Schlüsselpaar aus einem privaten und einem öffentlichen Schlüssel signiert. Wenn jemand eine signierte URL oder ein signiertes Cookie verwendet, um auf eine Datei zuzugreifen, werden die signierten und unsignierten Teile der URL oder des Cookies CloudFront verglichen. Wenn sie nicht übereinstimmen, wird die Datei CloudFront nicht bereitgestellt.

Sie müssen entweder private RSA 2048- oder ECDSA 256-Schlüssel zum Signieren oder für Cookies verwenden. URLs 

## Beschränken des Zugriffs auf Dateien in Amazon-S3-Buckets
<a name="private-content-overview-s3"></a>

Sie können den Inhalt in Ihrem Amazon S3-Bucket optional sichern, sodass Benutzer über die angegebene CloudFront Distribution darauf zugreifen können, aber nicht direkt mit Amazon S3 darauf zugreifen könnenURLs. Dadurch wird verhindert, dass jemand die Amazon S3 S3-URL umgeht CloudFront und verwendet, um Inhalte abzurufen, auf die Sie den Zugriff einschränken möchten. Dieser Schritt ist für die Verwendung von signed nicht erforderlichURLs, wir empfehlen ihn jedoch.

Gehen Sie wie folgt vor CloudFront URLs, damit Benutzer über auf Ihre Inhalte zugreifen können:
+ Erteilen Sie einer CloudFront *Origin-Zugriffskontrolle* die Erlaubnis, die Dateien im S3-Bucket zu lesen.
+ Erstellen Sie die Origin-Zugriffskontrolle und verknüpfen Sie sie mit Ihrer CloudFront Distribution.
+ Entfernen Sie allen anderen die Erlaubnis, Amazon S3 URLs zum Lesen der Dateien zu verwenden.

Weitere Informationen finden Sie unter [Beschränken des Zugriffs auf einen Amazon-S3-Ursprung](private-content-restricting-access-to-s3.md).

## Beschränken des Zugriffs auf Dateien auf benutzerdefinierten Ursprungsservern
<a name="forward-custom-headers-restrict-access"></a>

Wenn Sie einen benutzerdefinierten Ursprungsserver verwenden, können Sie optional benutzerdefinierte Header einrichten, um den Zugriff einzuschränken. CloudFront Damit Ihre Dateien von einem benutzerdefinierten Ursprung abgerufen werden können, müssen die Dateien über eine CloudFront standardmäßige HTTP- (oder HTTPS-) Anfrage zugänglich sein. Durch die Verwendung benutzerdefinierter Header können Sie den Zugriff auf Ihre Inhalte jedoch weiter einschränken, sodass Benutzer nur überCloudFront, nicht direkt darauf zugreifen können. Dieser Schritt ist nicht erforderlich, um signiert zu verwenden URLs, wir empfehlen ihn jedoch.

Um zu verlangen, dass Benutzer über auf Inhalte zugreifen CloudFront, ändern Sie die folgenden Einstellungen in Ihren CloudFront Distributionen:

**Angepasste Ursprungs-Header**  
Konfigurieren Sie CloudFront es so, dass benutzerdefinierte Header an Ihren Ursprung weitergeleitet werden. Siehe [Konfigurieren von CloudFront zum Hinzufügen von benutzerdefinierten Headern zu Ursprungsanforderungen](add-origin-custom-headers.md#add-origin-custom-headers-configure).

**Viewer-Protokollrichtlinien**  
Konfigurieren Sie Ihre Verteilung so, dass Betrachter für den Zugriff auf Ihre CloudFront HTTPS verwenden müssen. Siehe [Viewer-Protokollrichtlinien](DownloadDistValuesCacheBehavior.md#DownloadDistValuesViewerProtocolPolicy). 

**Ursprungsprotokollrichtlinien**  
Konfigurieren Sie Ihre Distribution so, dass CloudFront sie dasselbe Protokoll wie die Zuschauer verwenden muss, um Anfragen an den Ursprung weiterzuleiten. Siehe [Protokoll (nur benutzerdefinierte Ursprünge)](DownloadDistValuesOrigin.md#DownloadDistValuesOriginProtocolPolicy). 

Nachdem Sie diese Änderungen vorgenommen haben, aktualisieren Sie Ihre Anwendung auf Ihrem benutzerdefinierten Ursprung, sodass nur Anfragen akzeptiert werden, die die benutzerdefinierten Header enthalten, die Sie für das Senden konfiguriert CloudFront haben.

Die Kombination aus **Viewer Protocol Policy (Viewer-Protokollrichtlinie)** und **Origin Protocol Policy (Ursprungs-Protokollrichtlinie)** stellt sicher, dass die benutzerdefinierten Header während der Übertragung verschlüsselt werden. Wir empfehlen Ihnen jedoch, regelmäßig wie folgt vorzugehen, um die benutzerdefinierten Header, die an Ihren Ursprung CloudFront weitergeleitet werden, zu rotieren:

1. Aktualisieren Sie Ihre CloudFront Distribution, um damit zu beginnen, einen neuen Header an Ihren benutzerdefinierten Absender weiterzuleiten.

1. Aktualisieren Sie Ihre Anwendung so, dass sie den neuen Header als Bestätigung dafür akzeptiert, dass die Anfrage stammt CloudFront.

1. Wenn Anfragen den Header, den Sie ersetzen, nicht mehr enthalten, aktualisieren Sie Ihre Anwendung so, dass der alte Header nicht mehr als Bestätigung dafür akzeptiert wird, dass die Anfrage stammt CloudFront.

# Geben Sie Unterzeichner an, die signierte URLs und signierte Cookies erstellen können
<a name="private-content-trusted-signers"></a>

**Topics**
+ [Wählen Sie zwischen vertrauenswürdigen Schlüsselgruppen (empfohlen) und AWS-Konten](#choosing-key-groups-or-AWS-accounts)
+ [Erstellen von Schlüsselpaaren für Ihre Signaturgeber](#private-content-creating-cloudfront-key-pairs)
+ [Neuformatierung des privaten Schlüssels (nur .NET und Java)](#private-content-reformatting-private-key)
+ [Hinzufügen eines Signaturgebers zu einer Distribution](#private-content-adding-trusted-signers)
+ [Rotieren von Schlüsselpaaren](#private-content-rotating-key-pairs)

Um signierte URLs oder signierte Cookies zu erstellen, benötigen Sie einen *Unterzeichner*. Ein Unterzeichner ist entweder eine vertrauenswürdige Schlüsselgruppe, in der Sie erstellen CloudFront, oder ein AWS Konto, das ein CloudFront key pair enthält. Wir empfehlen, vertrauenswürdige Schlüsselgruppen mit signierten URLs und signierten Cookies zu verwenden. Weitere Informationen finden Sie unter [Wählen Sie zwischen vertrauenswürdigen Schlüsselgruppen (empfohlen) und AWS-Konten](#choosing-key-groups-or-AWS-accounts).

Der Aussteller erfüllt zwei Zwecke:
+ Sobald Sie den Unterzeichner zu Ihrer Distribution hinzufügen, wird verlangt, CloudFront dass Zuschauer signierte URLs oder signierte Cookies verwenden, um auf Ihre Dateien zuzugreifen.
+ Wenn Sie signierte URLs oder signierte Cookies erstellen, verwenden Sie den privaten Schlüssel aus dem key pair des Unterzeichners, um einen Teil der URL oder des Cookies zu signieren. Wenn jemand eine eingeschränkte Datei anfordert, CloudFront vergleicht er die Signatur in der URL oder im Cookie mit der unsignierten URL oder dem Cookie, um sicherzustellen, dass es nicht manipuliert wurde. CloudFront überprüft auch, ob die URL oder das Cookie gültig ist, was beispielsweise bedeutet, dass das Ablaufdatum und die Uhrzeit nicht abgelaufen sind.

Wenn Sie einen Unterzeichner angeben, geben Sie indirekt auch die Dateien an, für die signierte URLs oder signierte Cookies erforderlich sind, indem Sie den Unterzeichner zu einem Cache-Verhalten hinzufügen. Wenn Ihre Distribution nur ein Cache-Verhalten hat, müssen Zuschauer signierte URLs oder signierte Cookies verwenden, um auf jede Datei in der Distribution zuzugreifen. Wenn Sie mehrere Cache-Verhaltensweisen erstellen und einigen Cache-Verhalten Unterzeichner hinzufügen und anderen nicht, können Sie festlegen, dass Zuschauer signierte URLs oder signierte Cookies verwenden, um auf einige Dateien zuzugreifen und auf andere nicht.

Gehen Sie wie folgt vor, um die Unterzeichner (die privaten Schlüssel) anzugeben, die signierte URLs oder signierte Cookies erstellen dürfen, und um die Unterzeichner zu Ihrer CloudFront Distribution hinzuzufügen:

1. Entscheiden Sie, ob Sie eine vertrauenswürdige Schlüsselgruppe oder eine AWS-Konto als Unterzeichner verwenden möchten. Es wird empfohlen, eine vertrauenswürdige Schlüsselgruppe zu verwenden. Weitere Informationen finden Sie unter [Wählen Sie zwischen vertrauenswürdigen Schlüsselgruppen (empfohlen) und AWS-Konten](#choosing-key-groups-or-AWS-accounts).

1. Erstellen Sie für den Aussteller, den Sie in Schritt 1 ausgewählt haben, Schlüsselpaar aus öffentlichem und privatem Schlüssel. Weitere Informationen finden Sie unter [Erstellen von Schlüsselpaaren für Ihre Signaturgeber](#private-content-creating-cloudfront-key-pairs).

1. Wenn Sie.NET oder Java verwenden, um signierte URLs oder signierte Cookies zu erstellen, formatieren Sie den privaten Schlüssel neu. Weitere Informationen finden Sie unter [Neuformatierung des privaten Schlüssels (nur .NET und Java)](#private-content-reformatting-private-key).

1. Geben Sie in der Distribution, für die Sie signierte URLs oder signierte Cookies erstellen, den Unterzeichner an. Weitere Informationen finden Sie unter [Hinzufügen eines Signaturgebers zu einer Distribution](#private-content-adding-trusted-signers).

## Wählen Sie zwischen vertrauenswürdigen Schlüsselgruppen (empfohlen) und AWS-Konten
<a name="choosing-key-groups-or-AWS-accounts"></a>

Um signierte URLs oder signierte Cookies verwenden zu können, benötigen Sie einen *Unterzeichner*. Ein Unterzeichner ist entweder eine vertrauenswürdige Schlüsselgruppe, in der Sie erstellen CloudFront, oder eine, AWS-Konto die ein CloudFront key pair enthält. Es wird empfohlen, vertrauenswürdige Schlüsselgruppen zu verwenden, und zwar aus den folgenden Gründen:
+ Bei CloudFront Schlüsselgruppen müssen Sie nicht den Root-Benutzer des AWS Kontos verwenden, um die öffentlichen Schlüssel für CloudFront signierte URLs und signierte Cookies zu verwalten. [AWS Bewährte Methoden](https://docs.aws.amazon.com/general/latest/gr/root-vs-iam.html#aws_tasks-that-require-root) empfehlen, den Root-Benutzer nicht zu verwenden, wenn dies nicht erforderlich ist.
+ Mit CloudFront Schlüsselgruppen können Sie öffentliche Schlüssel, Schlüsselgruppen und vertrauenswürdige Unterzeichner mithilfe der CloudFront API verwalten. Sie können die API verwenden, um die Schlüsselerstellung und die Schlüsselrotation zu automatisieren. Wenn Sie den AWS Root-Benutzer verwenden, müssen Sie den AWS-Managementkonsole zur Verwaltung von CloudFront Schlüsselpaaren verwenden, sodass Sie den Vorgang nicht automatisieren können.
+ Da Sie Schlüsselgruppen mit der CloudFront API verwalten können, können Sie auch AWS Identity and Access Management (IAM) -Berechtigungsrichtlinien verwenden, um einzuschränken, was verschiedene Benutzer tun dürfen. Beispielsweise können Sie Benutzern erlauben, öffentliche Schlüssel hochzuladen, aber nicht zu löschen. Oder Sie können Benutzern erlauben, öffentliche Schlüssel zu löschen, jedoch nur dann, wenn bestimmte Bedingungen erfüllt sind, z. B. Multi-Factor-Authentication, das Senden der Anforderung aus einem bestimmten Netzwerk oder das Senden der Anforderung innerhalb eines bestimmten Datums- und Uhrzeitbereichs.
+ Mit CloudFront Schlüsselgruppen können Sie Ihrer CloudFront Distribution eine höhere Anzahl von öffentlichen Schlüsseln zuordnen, was Ihnen mehr Flexibilität bei der Verwendung und Verwaltung der öffentlichen Schlüssel bietet. Standardmäßig können Sie bis zu vier Schlüsselgruppen einer einzelnen Distribution zuordnen, und Sie können bis zu fünf öffentliche Schlüssel in einer Schlüsselgruppe haben.

  Wenn Sie den Root-Benutzer für das AWS Konto verwenden, um CloudFront Schlüsselpaare zu verwalten, können Sie nur bis zu zwei aktive CloudFront Schlüsselpaare pro AWS Konto haben.

## Erstellen von Schlüsselpaaren für Ihre Signaturgeber
<a name="private-content-creating-cloudfront-key-pairs"></a>

Jeder Unterzeichner, den Sie zum Erstellen CloudFront signierter URLs oder signierter Cookies verwenden, muss über ein öffentlich-privates key pair verfügen. Der Unterzeichner verwendet seinen privaten Schlüssel, um die URL oder die Cookies zu signieren, und CloudFront verwendet den öffentlichen Schlüssel, um die Signatur zu verifizieren.

Die Art und Weise, wie Sie ein key pair erstellen, hängt davon ab, ob Sie eine vertrauenswürdige Schlüsselgruppe als Unterzeichner (empfohlen) oder ein CloudFront key pair verwenden. Weitere Informationen finden Sie in den folgenden Abschnitten. Das Schlüsselpaar, das Sie erstellen, muss die folgenden Anforderungen erfüllen:
+ Es muss entweder ein Schlüsselpaar des Typs SSH-2 RSA 2048 oder ECDSA 256 sein.
+ Es muss im base64-kodierten PEM-Format vorliegen.

Um Ihre Anwendungen zu schützen, empfehlen wir Ihnen, Schlüsselpaare regelmäßig zu rotieren. Weitere Informationen finden Sie unter [Rotieren von Schlüsselpaaren](#private-content-rotating-key-pairs).

### Erstellen eines Schlüsselpaars für eine vertrauenswürdige Schlüsselgruppe (empfohlen)
<a name="create-key-pair-and-key-group"></a>

Führen Sie die folgenden Schritte aus, um ein Schlüsselpaar für eine vertrauenswürdige Schlüsselgruppe zu erstellen:

1. Erstellen Sie das öffentliche-private Schlüsselpaar.

1. Laden Sie den öffentlichen Schlüssel auf CloudFront hoch.

1. Fügen Sie den öffentlichen Schlüssel einer CloudFront Schlüsselgruppe hinzu.

Weitere Informationen finden Sie in den folgenden Verfahren.<a name="private-content-uploading-cloudfront-public-key-procedure"></a>

**Erstellen eines Schlüsselpaares**
**Anmerkung**  
In den folgenden Schritten wird OpenSSL als Beispiel für eine Methode zur Erstellung eines Schlüsselpaars verwendet. Es gibt viele andere Möglichkeiten, ein RSA- oder ECDSA-Schlüsselpaar zu erstellen.

1. Führen Sie einen der folgenden Beispielbefehle aus:
   + Der folgende Beispielbefehl verwendet OpenSSL, um ein RSA-Schlüsselpaar mit einer Länge von 2048 Bit zu generieren und in der Datei mit dem Namen `private_key.pem` zu speichern.

     ```
     openssl genrsa -out private_key.pem 2048
     ```
   + Der folgende Beispielbefehl verwendet OpenSSL, um ein ECDSA-Schlüsselpaar mit der `prime256v1`-Kurve zu generieren und in der Datei namens `private_key.pem` zu speichern.

     ```
     openssl ecparam -name prime256v1 -genkey -noout -out privatekey.pem
     ```

1. Die erstellte Datei enthält den öffentlichen und den privaten Schlüssel. Der folgende Beispielbefehl extrahiert den öffentlichen Schlüssel aus der Datei mit dem Namen `private_key.pem`.

   ```
   openssl rsa -pubout -in private_key.pem -out public_key.pem
   ```

   Sie laden den öffentlichen Schlüssel (in der `public_key.pem`-Datei) später im folgenden Verfahren hoch.

**Um den öffentlichen Schlüssel hochzuladen CloudFront**

1. Melden Sie sich bei der an AWS-Managementkonsole und öffnen Sie die CloudFront Konsole unter[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home).

1. Wählen Sie im Navigationsmenü die Option **Public keys (Öffentliche Schlüssel)**.

1. Wählen Sie **Öffentlichen Schlüssel erstellen**.

1. Führen Sie im Fenster **Öffentlichen Schlüssel erstellen** die folgenden Schritte aus:

   1. Geben Sie unter **Key name (Schlüsselname)** einen Namen ein, um den öffentlichen Schlüssel zu identifizieren.

   1. Fügen Sie unter **Key value (Schlüsselwert)** den öffentlichen Schlüssel ein. Wenn Sie die Schritte im vorangegangenen Verfahren ausgeführt haben, befindet sich der öffentliche Schlüssel in der Datei mit dem Namen `public_key.pem`. Um den Inhalt des öffentlichen Schlüssels zu kopieren und einzufügen, können Sie Folgendes tun:
      + Verwenden Sie den **cat**-Befehl in der macOS- oder Linux-Befehlszeile wie folgt:

        ```
        cat public_key.pem
        ```

        Kopieren Sie die Ausgabe dieses Befehls und fügen Sie sie dann in das Feld **Key value (Schlüsselwert)** ein.
      + Öffnen Sie die `public_key.pem` Datei mit einem Klartext-Editor wie Notepad (unter Windows) oder TextEdit (unter macOS). Kopieren Sie den Inhalt der Datei und fügen Sie ihn dann in das Feld **key value (Schlüsselwert)** ein.

   1. (Optional) Fügen Sie unter **Comment (Kommentar)** einen Kommentar hinzu, um den öffentlichen Schlüssel zu beschreiben.

   Wenn Sie fertig sind, wählen Sie **Add (Hinzufügen)**.

1. Notieren Sie die ID des öffentlichen Schlüssels. Sie verwenden ihn später, wenn Sie signierte URLs oder signierte Cookies erstellen, als Wert für das Feld. `Key-Pair-Id`

**So fügen Sie den öffentlichen Schlüssel zu einer Schlüsselgruppe hinzu:**

1. Öffnen Sie die CloudFront Konsole unter[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home).

1. Wählen Sie im Navigationsmenü die Option **Key groups (Schlüsselgruppen)**.

1. Wählen Sie **Add key group (Schlüsselgruppe hinzufügen)**.

1. Führen Sie auf der Seite **Create key group (Schlüsselgruppe erstellen)** die folgenden Schritte aus:

   1. Geben Sie unter **Key group name (Schlüsselgruppenname)** einen Namen ein, um die Schlüsselgruppe zu identifizieren.

   1. (Optional) Geben Sie unter **Comment (Kommentar)** einen Kommentar ein, um die Schlüsselgruppe zu beschreiben.

   1. Wählen Sie für **Public keys (Öffentliche Schlüssel)** den öffentlichen Schlüssel aus, der der Schlüsselgruppe hinzugefügt werden soll. Wählen Sie dann **Add (Hinzufügen)** aus. Wiederholen Sie diesen Schritt für jeden öffentlichen Schlüssel, den Sie der Schlüsselgruppe hinzufügen möchten.

1. Wählen Sie **Create key group (Schlüsselgruppe erstellen)** aus.

1. Notieren Sie den Namen der Schlüsselgruppe. Sie verwenden es später, um die Schlüsselgruppe einem Cache-Verhalten in einer CloudFront Distribution zuzuordnen. (In der CloudFront API verwenden Sie die Schlüsselgruppen-ID, um die Schlüsselgruppe einem Cache-Verhalten zuzuordnen.)

### Ein CloudFront key pair erstellen (nicht empfohlen, erfordert den AWS-Konto Root-Benutzer)
<a name="create-key-pair-aws-account"></a>

**Wichtig**  
Es wird empfohlen, einen öffentlichen Schlüssel für eine vertrauenswürdige Schlüsselgruppe zu erstellen, anstatt diese Schritte auszuführen. Die empfohlene Methode zum Erstellen öffentlicher Schlüssel für signierte URLs und signierte Cookies finden Sie unter[Erstellen eines Schlüsselpaars für eine vertrauenswürdige Schlüsselgruppe (empfohlen)](#create-key-pair-and-key-group).

Sie können ein CloudFront key pair auf folgende Weise erstellen:
+ Erstellen Sie ein key pair in der AWS-Managementkonsole und laden Sie den privaten Schlüssel herunter. Weitere Informationen finden Sie im folgenden Verfahren.
+ Erstellen Sie mithilfe einer Anwendung wie OpenSSL ein RSA-Schlüsselpaar und laden Sie den öffentlichen Schlüssel auf die AWS-Managementkonsole hoch. Weitere Informationen zum Erstellen eines RSA-Schlüsselpaars finden Sie unter [Erstellen eines Schlüsselpaars für eine vertrauenswürdige Schlüsselgruppe (empfohlen)](#create-key-pair-and-key-group).<a name="private-content-creating-cloudfront-key-pairs-procedure"></a>

**Um CloudFront Schlüsselpaare zu erstellen in AWS-Managementkonsole**

1. Melden Sie sich AWS-Managementkonsole mit den Anmeldeinformationen des Root-Benutzers des AWS Kontos an.
**Wichtig**  
IAM-Benutzer können keine CloudFront Schlüsselpaare erstellen. Sie müssen sich mit Stammbenutzer-Anmeldeinformationen anmelden, um Schlüsselpaare zu erstellen.

1. Wählen Sie Ihren Kontonamen und dann **My Security Credentials (Meine Sicherheitsanmeldeinformationen)** aus.

1. Wählen Sie **CloudFront Schlüsselpaare** aus.

1. Vergewissern Sie sich, dass Sie nicht mehr als ein aktives Schlüsselpaar haben. Sie können kein Schlüsselpaar erstellen, wenn Sie bereits zwei aktive Schlüsselpaare haben.

1. Wählen Sie **Create a new key pair (Neues Schlüsselpaar erstellen)** aus.
**Anmerkung**  
Sie können sich auch dafür entscheiden, Ihr eigenes key pair zu erstellen und den öffentlichen Schlüssel hochzuladen. CloudFront Schlüsselpaare unterstützen 1024-, 2048- oder 4096-Bit-Schlüssel.

1. Wählen Sie im Dialogfeld **Create Key Pair (Schlüsselpaar erstellen)** die Option **Download Private Key File (Private Schlüsseldatei herunterladen)** und speichern Sie die Datei dann auf Ihrem Computer.
**Wichtig**  
Speichern Sie den privaten Schlüssel für Ihr CloudFront key pair an einem sicheren Ort und legen Sie die Berechtigungen für die Datei fest, sodass nur die gewünschten Administratoren sie lesen können. Wenn jemand Ihren privaten Schlüssel erhält, kann er gültige signierte URLs und signierte Cookies generieren und Ihre Inhalte herunterladen. Sie können den privaten Schlüssel nicht erneut abrufen. Wenn Sie ihn also verlieren oder löschen, müssen Sie ein neues CloudFront key pair erstellen.

1. Notieren Sie die Schlüsselpaar-ID für Ihr Schlüsselpaar. (In der AWS-Managementkonsole wird dies als **Access Key-ID** bezeichnet.) Sie werden sie verwenden, wenn Sie signierte URLs oder signierte Cookies erstellen.

## Neuformatierung des privaten Schlüssels (nur .NET und Java)
<a name="private-content-reformatting-private-key"></a>

Wenn Sie.NET oder Java verwenden, um signierte URLs oder signierte Cookies zu erstellen, können Sie den privaten Schlüssel aus Ihrem key pair nicht im Standard-PEM-Format verwenden, um die Signatur zu erstellen. Führen Sie stattdessen die folgenden Schritte aus:
+ **.NET Framework** – Konvertieren Sie den privaten Schlüssel in das vom .NET Framework verwendete XML-Format. Es sind mehrere Tools verfügbar.
+ **Java** – Konvertieren Sie den privaten Schlüssel in das DER-Format. Eine Möglichkeit, dies zu tun, ist der folgende OpenSSL-Befehl. Im folgenden Befehl ist `private_key.pem` der Name der Datei, die den privaten Schlüssel im PEM-Format enthält, und `private_key.der` der Name der Datei, die den privaten Schlüssel im DER-Format enthält, nachdem Sie den Befehl ausgeführt haben.

  ```
  openssl pkcs8 -topk8 -nocrypt -in private_key.pem -inform PEM -out private_key.der -outform DER
  ```

  Um sicherzustellen, dass der Encoder korrekt funktioniert, fügen Sie Ihrem Projekt das JAR für die Bouncy Castle-Java-Kryptografie APIs hinzu und fügen Sie dann den Bouncy Castle-Anbieter hinzu.

## Hinzufügen eines Signaturgebers zu einer Distribution
<a name="private-content-adding-trusted-signers"></a>

Ein Unterzeichner ist die vertrauenswürdige Schlüsselgruppe (empfohlen) oder das CloudFront key pair, das signierte URLs und signierte Cookies für eine Distribution erstellen kann. Um signierte URLs oder signierte Cookies mit einer CloudFront Distribution zu verwenden, müssen Sie einen Unterzeichner angeben.

Aussteller sind mit Cache-Verhaltensweisen verknüpft. Auf diese Weise können Sie signierte URLs oder signierte Cookies für einige Dateien und nicht für andere in derselben Distribution verlangen. Für eine Distribution sind signierte URLs oder Cookies nur für Dateien erforderlich, die dem entsprechenden Cache-Verhalten zugeordnet sind.

Ebenso kann ein Unterzeichner nur Cookies für Dateien URLs signieren, die mit den entsprechenden Cache-Verhaltensweisen verknüpft sind. Wenn Sie beispielsweise einen Unterzeichner für ein Cache-Verhalten und einen anderen Unterzeichner für ein anderes Cache-Verhalten haben, kann keiner der Unterzeichner signierte URLs oder Cookies für Dateien erstellen, die mit dem anderen Cache-Verhalten verknüpft sind.

**Wichtig**  
Bevor Sie einen Aussteller zu Ihrer Distribution hinzufügen, gehen Sie wie folgt vor:  
Definieren Sie die Pfadmuster in den Cache-Verhaltensweisen und die Reihenfolge der Cache-Verhaltensweisen sorgfältig, damit Sie Benutzern keinen unbeabsichtigten Zugriff auf Ihre Inhalte gewähren oder verhindern, dass sie auf Inhalte zugreifen, die für alle verfügbar sein sollen.  
Nehmen wir beispielsweise an, eine Anfrage stimmt mit dem Pfadmuster für zwei Cache-Verhalten überein. Für das erste Cache-Verhalten sind keine signierten URLs oder signierten Cookies erforderlich, für das zweite Cache-Verhalten schon. Benutzer können auf die Dateien zugreifen, ohne signierte URLs oder signierte Cookies zu verwenden, da das Cache-Verhalten CloudFront verarbeitet wird, das mit dem ersten Treffer verknüpft ist.  
Weitere Informationen zu Pfadmustern finden Sie unter [Pfadmuster](DownloadDistValuesCacheBehavior.md#DownloadDistValuesPathPattern).
Stellen Sie bei einer Distribution, die Sie bereits zum Verteilen von Inhalten verwenden, sicher, dass Sie bereit sind, signierte URLs und signierte Cookies zu generieren, bevor Sie einen Unterzeichner hinzufügen. Wenn Sie einen Unterzeichner hinzufügen, CloudFront lehnt Anfragen ab, die keine gültige signierte URL oder kein signiertes Cookie enthalten.

Sie können Ihrer Distribution Unterzeichner entweder über die CloudFront Konsole oder die API hinzufügen. CloudFront

------
#### [ Console ]

Die folgenden Schritte zeigen, wie Sie eine vertrauenswürdige Schlüsselgruppe als Aussteller hinzufügen. Sie können auch einen AWS-Konto Unterzeichner als vertrauenswürdigen Unterzeichner hinzufügen, dies wird jedoch nicht empfohlen.<a name="private-content-adding-trusted-signers-console-procedure"></a>

**So fügen Sie einen Aussteller mit der Konsole zu einer Distribution hinzu:**

1. Notieren Sie die Schlüsselgruppen-ID der Schlüsselgruppe, die Sie als vertrauenswürdigen Aussteller verwenden möchten. Weitere Informationen finden Sie unter [Erstellen eines Schlüsselpaars für eine vertrauenswürdige Schlüsselgruppe (empfohlen)](#create-key-pair-and-key-group).

1. Öffnen Sie die CloudFront Konsole unter. [https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home)

1. Wählen Sie die Distribution aus, deren Dateien Sie mit signierten URLs oder signierten Cookies schützen möchten.
**Anmerkung**  
Wenn Sie einer neuen Distribution einen Aussteller hinzufügen möchten, geben Sie dieselben Einstellungen an, die in Schritt 6 beschrieben werden, wenn Sie die Distribution erstellen.

1. Wählen Sie die Registerkarte **Behaviors** aus.

1. Wählen Sie das Cache-Verhalten aus, dessen Pfadmuster den Dateien entspricht, die Sie mit signierten URLs oder signierten Cookies schützen möchten, und wählen Sie dann **Bearbeiten** aus.

1. Führen Sie auf der Seite **Edit Behavior (Verhalten bearbeiten)** die folgenden Schritte aus:

   1. Wählen Sie für „**Zuschauerzugriff einschränken“ (signierte URLs oder signierte Cookies verwenden)** die Option **Ja** aus.

   1. Wählen Sie in **Trusted Key Groups or Trusted Signer (Vertrauenswürdige Schlüsselgruppen oder vertrauenswürdiger Aussteller)** die Option **Trusted Key Groups (Vertrauenswürdige Schlüsselgruppen)** aus.

   1. Wählen Sie unter **Trusted Key Groups (Vertrauenswürdige Schlüsselgruppen)** die hinzuzufügende Schlüsselgruppe aus, und wählen Sie dann **Add (Hinzufügen)**. Wiederholen Sie diesen Vorgang, wenn Sie mehr als eine Schlüsselgruppe hinzufügen möchten.

1. Wählen Sie **Yes, Edit (Ja, Bearbeiten)**, um das Cache-Verhalten zu aktualisieren.

------
#### [ API ]

Sie können die CloudFront API verwenden, um eine vertrauenswürdige Schlüsselgruppe als Unterzeichner hinzuzufügen. Sie können einen Aussteller zu einer vorhandenen oder zu einer neuen Distribution hinzufügen. Geben Sie in beiden Fällen die entsprechenden Werte im `TrustedKeyGroups`-Element an.

Sie können auch einen AWS-Konto Unterzeichner als vertrauenswürdigen Unterzeichner hinzufügen, dies wird jedoch nicht empfohlen.

Weitere Informationen finden Sie in der *Amazon CloudFront API-Referenz* zu den folgenden Themen:
+ **Eine bestehende Distribution aktualisieren** — [UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)
+ **Eine neue Distribution erstellen** — [CreateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_CreateDistribution.html)

------

## Rotieren von Schlüsselpaaren
<a name="private-content-rotating-key-pairs"></a>

Wir empfehlen Ihnen, Ihre Schlüsselpaare für signierte URLs und signierte Cookies regelmäßig zu wechseln (zu ändern). Gehen Sie wie folgt vor, um Schlüsselpaare zu wechseln, die Sie verwenden, um signierte URLs oder signierte Cookies zu erstellen, ohne dass sie ungültig werden, URLs oder um Cookies, die noch nicht abgelaufen sind, zu erstellen:

1. Erstellen Sie ein neues Schlüsselpaar, und fügen Sie den öffentlichen Schlüssel zu einer Schlüsselgruppe hinzu. Weitere Informationen finden Sie unter [Erstellen eines Schlüsselpaars für eine vertrauenswürdige Schlüsselgruppe (empfohlen)](#create-key-pair-and-key-group).

1. Wenn Sie im vorherigen Schritt eine neue Schlüsselgruppe erstellt haben, [fügen Sie die Schlüsselgruppe der Distribution als Aussteller](#private-content-adding-trusted-signers) hinzu.
**Wichtig**  
Entfernen Sie noch keine vorhandenen öffentlichen Schlüssel aus der Schlüsselgruppe oder Schlüsselgruppen aus der Distribution. Fügen Sie nur die neuen hinzu.

1. Aktualisieren Sie Ihre Anwendung so, dass Signaturen mithilfe der privaten Schlüssel von den neuen Schlüsselpaaren erstellt werden. Vergewissern Sie sich, dass die signierten Cookies URLs oder Cookies, die mit den neuen privaten Schlüsseln signiert wurden, funktionieren.

1. Warten Sie, bis das Ablaufdatum abgelaufen ist URLs oder bis Cookies, die mit dem vorherigen privaten Schlüssel signiert wurden, abgelaufen sind. Entfernen Sie dann den alten öffentlichen Schlüssel aus der Schlüsselgruppe. Wenn Sie in Schritt 2 eine neue Schlüsselgruppe erstellt haben, entfernen Sie die alte Schlüsselgruppe aus Ihrer Distribution.

# Entscheiden Sie sich dafür, signierte URLs oder signierte Cookies zu verwenden
<a name="private-content-choosing-signed-urls-cookies"></a>

CloudFront signierte URLs und signierte Cookies bieten dieselben grundlegenden Funktionen: Sie ermöglichen es Ihnen, zu kontrollieren, wer auf Ihre Inhalte zugreifen kann. Wenn Sie private Inhalte bereitstellen möchten CloudFront und sich entscheiden möchten, ob Sie signierte URLs oder signierte Cookies verwenden möchten, sollten Sie Folgendes beachten.

Verwenden Sie signierte Dateien URLs in den folgenden Fällen:
+ Sie möchten den Zugriff auf einzelne Dateien einschränken, z. B. einen Installations-Download für Ihre Anwendung.
+ Ihre Benutzer verwenden einen Client (z. B. einen benutzerdefinierten HTTP-Client), der keine Cookies unterstützt.

Verwenden Sie signierte Cookies in den folgenden Fällen:
+ Sie möchten Zugriff auf mehrere beschränkte Dateien bereitstellen, z. B. auf alle Dateien für ein Video im HLS-Format oder alle Dateien im Bereich des Abonnenten einer Website.
+ Sie möchten Ihre aktuelle Version nicht ändern URLs.

Wenn Sie derzeit keine URLs signierten Cookies verwenden und Ihr (unsigned) einen der folgenden Abfragezeichenfolge-Parameter URLs enthält, können Sie URLs weder signierte noch signierte Cookies verwenden:
+ `Expires`
+ `Policy`
+ `Signature`
+ `Key-Pair-Id`

CloudFront geht davon aus URLs , dass die Parameter, die einen dieser Abfragezeichenfolgen enthalten URLs, signiert sind, und betrachtet daher signierte Cookies nicht.

## Verwenden Sie sowohl signierte als URLs auch signierte Cookies
<a name="private-content-using-signed-urls-and-cookies"></a>

Signierte Cookies haben URLs Vorrang vor signierten Cookies. Wenn Sie sowohl signierte URLs als auch signierte Cookies verwenden, um den Zugriff auf dieselben Dateien zu kontrollieren, und ein Betrachter eine signierte URL verwendet, um eine Datei anzufordern, CloudFront wird nur anhand der signierten URL bestimmt, ob die Datei an den Betrachter zurückgegeben werden soll.

# Verwenden Sie signierte URLs
<a name="private-content-signed-urls"></a>

Eine signierte URL enthält zusätzliche Informationen, wie z. B. Ablaufdatum und -zeit, mit denen Sie den Zugriff auf Ihre Inhalte besser kontrollieren können. Diese zusätzlichen Informationen sind in einer Richtlinienanweisung enthalten, die entweder auf einer vordefinierten oder einer benutzerdefinierten Richtlinie basieren. Die Unterschiede zwischen vordefinierten und benutzerdefinierten Richtlinien sind in den nächsten beiden Abschnitten beschrieben.

**Anmerkung**  
Sie können einige signierte URLs mithilfe vordefinierter Richtlinien und einige signierte URLs mithilfe benutzerdefinierter Richtlinien für dieselbe Distribution erstellen.

**Topics**
+ [Entscheiden Sie sich dafür, vordefinierte oder benutzerdefinierte Richtlinien für signierte Richtlinien zu verwenden URLs](#private-content-choosing-canned-custom-policy)
+ [Wie URLs funktionieren signierte](#private-content-how-signed-urls-work)
+ [Entscheiden Sie, wie lange Unterschriften gültig URLs sind](#private-content-overview-choosing-duration)
+ [Wann CloudFront überprüft das Ablaufdatum und die Uhrzeit in einer signierten URL](#private-content-check-expiration)
+ [Beispiel-Code und Drittanbieter-Tools](#private-content-overview-sample-code)
+ [Erstellen einer signierten URL mit einer vordefinierten Richtlinie](private-content-creating-signed-url-canned-policy.md)
+ [Erstellen einer signierten URL mit einer benutzerdefinierten Richtlinie](private-content-creating-signed-url-custom-policy.md)

## Entscheiden Sie sich dafür, vordefinierte oder benutzerdefinierte Richtlinien für signierte Richtlinien zu verwenden URLs
<a name="private-content-choosing-canned-custom-policy"></a>

Wenn Sie eine signierte URL erstellen, schreiben Sie eine Richtlinienanweisung im JSON-Format, welche die Einschränkungen für die signierte URL festlegt, z. B. wie lange die URL gültig ist. Sie können entweder eine vordefinierte Richtlinie oder eine benutzerdefinierte Richtlinie verwenden. Im Folgenden finden Sie einen Vergleich zwischen vordefinierten und benutzerdefinierten Richtlinien:


****  

| Beschreibung | Vordefinierte Richtlinie | Benutzerdefinierte Richtlinie | 
| --- | --- | --- | 
| Sie können die Richtlinienanweisung für mehrere Dateien wiederverwenden. Um die Richtlinienanweisung wiederzuverwenden, müssen Sie Platzhalterzeichen im `Resource`-Objekt verwenden. Weitere Informationen finden Sie unter [Werte, die Sie in der Richtlinienanweisung für eine signierte URL angeben, die eine benutzerdefinierte Richtlinie verwendet](private-content-creating-signed-url-custom-policy.md#private-content-custom-policy-statement-values).)  | Nein | Ja | 
| Sie können das Datum und die Zeit festlegen, ab denen Benutzer auf Ihre Inhalte zugreifen können. | Nein | Ja (optional) | 
| Sie können das Datum und die Zeit festlegen, ab denen Benutzer nicht mehr auf Ihre Inhalte zugreifen können. | Ja | Ja | 
| Sie können die IP-Adresse oder den Bereich von IP-Adressen der Benutzer festlegen, die auf Ihre Inhalte zugreifen können. | Nein | Ja (optional) | 
| Die signierte URL enthält eine Base64-codierte Version der Richtlinie, was zu einer längeren URL führt. | Nein | Ja | 

Informationen zum Erstellen signierter Richtlinien URLs mithilfe einer *vordefinierten* Richtlinie finden Sie unter[Erstellen einer signierten URL mit einer vordefinierten Richtlinie](private-content-creating-signed-url-canned-policy.md).

Informationen zum Erstellen signierter Dateien URLs mithilfe einer *benutzerdefinierten* Richtlinie finden Sie unter[Erstellen einer signierten URL mit einer benutzerdefinierten Richtlinie](private-content-creating-signed-url-custom-policy.md).

## Wie URLs funktionieren signierte
<a name="private-content-how-signed-urls-work"></a>

Hier finden Sie eine Übersicht darüber, wie Sie Amazon S3 für signiert konfigurieren CloudFront URLs und wie CloudFront reagiert, wenn ein Benutzer eine signierte URL verwendet, um eine Datei anzufordern. 

1. Geben Sie in Ihrer CloudFront Distribution eine oder mehrere vertrauenswürdige Schlüsselgruppen an, die die öffentlichen Schlüssel enthalten, die zur Überprüfung der URL-Signatur verwendet werden CloudFront können. Sie verwenden die entsprechenden privaten Schlüssel, um die zu signieren URLs.

   CloudFront unterstützt URLs mit RSA 2048 und ECDSA 256 signierte Schlüsselsignaturen.

   Weitere Informationen finden Sie unter [Geben Sie Unterzeichner an, die signierte URLs und signierte Cookies erstellen können](private-content-trusted-signers.md).

1. Entwickeln Sie Ihre Anwendung, um zu ermitteln, ob ein Benutzer Zugriff auf Ihre Inhalte haben sollte, und um signierte URLs Dateien oder Teile Ihrer Anwendung zu erstellen, auf die Sie den Zugriff beschränken möchten. Weitere Informationen finden Sie unter den folgenden Themen:
   + [Erstellen einer signierten URL mit einer vordefinierten Richtlinie](private-content-creating-signed-url-canned-policy.md)
   + [Erstellen einer signierten URL mit einer benutzerdefinierten Richtlinie](private-content-creating-signed-url-custom-policy.md)

1. Ein Benutzer fordert eine Datei an, für die Sie eine Signatur benötigen möchten URLs.

1. Ihre Anwendung stellt sicher, dass der Benutzer zum Zugriff auf die Datei berechtigt ist: Er hat sich angemeldet, für den Zugriff auf die Inhalte bezahlt oder andere Anforderungen für den Zugriff erfüllt.

1. Ihre Anwendung erstellt eine signierte URL und gibt diese an den Benutzer zurück.

1. Über die signierte URL kann der Benutzer die Inhalte herunterladen oder streamen.

   Dieser Schritt erfolgt automatisch. Der Benutzer muss in der Regel keine zusätzlichen Schritte ausführen, um auf den Inhalt zuzugreifen. Wenn ein Benutzer beispielsweise in einem Web-Browser auf Ihre Inhalte zugreift, gibt Ihre Anwendung die signierte URL an den Browser zurück. Der Browser verwendet sofort die signierte URL, um auf die Datei im CloudFront Edge-Cache zuzugreifen, ohne dass der Benutzer eingreifen muss.

1. CloudFront verwendet den öffentlichen Schlüssel, um die Signatur zu validieren und zu bestätigen, dass die URL nicht manipuliert wurde. Wenn die Signatur ungültig ist, wird die Anfrage abgelehnt. 

   Wenn die Signatur gültig ist, überprüft CloudFront die Richtlinienanweisung in der URL (oder erstellt eine, wenn Sie eine vordefinierte Richtlinie verwenden), um zu bestätigen, dass die Anfrage noch gültig ist. Wenn Sie beispielsweise ein Anfangs- und Enddatum und eine Uhrzeit für die URL angegeben haben, wird CloudFront bestätigt, dass der Benutzer versucht, während des Zeitraums, für den Sie den Zugriff zulassen möchten, auf Ihre Inhalte zuzugreifen. 

   Wenn die Anforderung die Anforderungen der Richtlinienerklärung CloudFront erfüllt, werden die Standardoperationen ausgeführt: Ermittelt, ob sich die Datei bereits im Edge-Cache befindet, leitet die Anforderung gegebenenfalls an den Ursprung weiter und gibt die Datei an den Benutzer zurück.

**Anmerkung**  
Wenn eine unsignierte URL Abfragezeichenfolgenparameter enthält, stellen Sie sicher, dass Sie diese in den Teil der URL einschließen, den Sie signieren. Wenn Sie einer signierten URL nach der Erstellung eine Abfragezeichenfolge hinzufügen, gibt die URL einen HTTP 403-Status zurück.

## Entscheiden Sie, wie lange Unterschriften gültig URLs sind
<a name="private-content-overview-choosing-duration"></a>

Sie können private Inhalte mithilfe einer signierten URL verteilen, die nur für einen kurzen Zeitraum gültig ist – vielleicht nur für ein paar Minuten. Signierte URLs , die für einen so kurzen Zeitraum gültig sind, eignen sich gut für die Verteilung von Inhalten on-the-fly an einen Benutzer zu einem bestimmten Zweck, z. B. zur Verteilung von Leihfilmen oder Musikdownloads an Kunden auf Abruf. Wenn URLs Ihre signierten Dokumente nur für einen kurzen Zeitraum gültig sind, möchten Sie sie wahrscheinlich automatisch mit einer von Ihnen entwickelten Anwendung generieren. Wenn der Benutzer beginnt, eine Datei herunterzuladen oder eine Mediendatei abzuspielen, CloudFront vergleicht er die Ablaufzeit in der URL mit der aktuellen Uhrzeit, um festzustellen, ob die URL noch gültig ist.

Sie können private Inhalte auch mithilfe einer signierten URL verteilen, die für einen längeren Zeitraum gültig ist – vielleicht für viele Jahre. Signierte URLs , die für einen längeren Zeitraum gültig sind, sind nützlich, um private Inhalte an bekannte Benutzer zu verteilen, z. B. um einen Geschäftsplan an Investoren zu verteilen oder Schulungsmaterial an Mitarbeiter zu verteilen. Sie können eine Anwendung entwickeln, mit der diese längerfristigen signierten Dateien URLs für Sie generiert werden.

## Wann CloudFront überprüft das Ablaufdatum und die Uhrzeit in einer signierten URL
<a name="private-content-check-expiration"></a>

CloudFront überprüft das Ablaufdatum und die Uhrzeit in einer signierten URL zum Zeitpunkt der HTTP-Anfrage. Wenn ein Client unmittelbar vor der Ablaufzeit mit dem Download einer großen Datei beginnt, sollte der Download abgeschlossen werden, auch wenn die Ablaufzeit während des Downloads überschritten wird. Wenn die TCP-Verbindung getrennt wird und der Client nach Überschreitung der Ablaufzeit versucht, den Download erneut zu starten, schlägt der Download fehl.

Wenn ein Client Range verwendet GETs , um eine Datei in kleineren Teilen abzurufen, schlägt jede GET-Anforderung fehl, die nach Ablauf der Ablaufzeit erfolgt. Weitere Informationen zu Range GETs finden Sie unter[Wie CloudFront werden Teilanfragen für ein Objekt (BereichGETs) verarbeitet](RangeGETs.md).

## Beispiel-Code und Drittanbieter-Tools
<a name="private-content-overview-sample-code"></a>

Beispielcode, der den Hash-Teil und den signierten Teil von signed erstellt URLs, finden Sie in den folgenden Themen:
+ [Erstellen einer URL-Signatur mit Perl](CreateURLPerl.md)
+ [Erstellen einer URL-Signatur mit PHP](CreateURL_PHP.md)
+ [Erstellen einer URL-Signatur mithilfe von C\$1 und dem .NET Framework](CreateSignatureInCSharp.md)
+ [Erstellen einer URL-Signatur mit Java](CFPrivateDistJavaDevelopment.md)

# Erstellen einer signierten URL mit einer vordefinierten Richtlinie
<a name="private-content-creating-signed-url-canned-policy"></a>

Führen Sie die folgenden Schritte aus, um eine signierte URL mit einer vordefinierten Richtlinie zu erstellen.<a name="private-content-creating-signed-url-canned-policy-procedure"></a>

**So erstellen Sie eine signierte URL mit einer vordefinierten Richtlinie**

1. Wenn Sie.NET oder Java verwenden, um signierte zu erstellen URLs, und wenn Sie den privaten Schlüssel für Ihr key pair nicht vom standardmäßigen .pem-Format in ein mit .NET oder Java kompatibles Format umformatiert haben, tun Sie dies jetzt. Weitere Informationen finden Sie unter [Neuformatierung des privaten Schlüssels (nur .NET und Java)](private-content-trusted-signers.md#private-content-reformatting-private-key).

1. Verketten Sie die folgenden Werte. Sie können das Format in diesem Beispiel für eine signierte URL verwenden. 

   ```
   https://d111111abcdef8.cloudfront.net/image.jpg?color=red&size=medium&Expires=1767290400&Signature=nitfHRCrtziwO2HwPfWw~yYDhUF5EwRunQA-j19DzZrvDh6hQ73lDx~-ar3UocvvRQVw6EkC~GdpGQyyOSKQim-TxAnW7d8F5Kkai9HVx0FIu-5jcQb0UEmatEXAMPLE3ReXySpLSMj0yCd3ZAB4UcBCAqEijkytL6f3fVYNGQI6&Key-Pair-Id=K2JCJMDEHXQW5F
   ```

   Entfernen Sie alle Leerzeichen (einschließlich Tabulatoren und Zeilenumbruchzeichen). Möglicherweise müssen Sie in der Zeichenfolge im Anwendungscode Escape-Zeichen einfügen. Alle Werte verfügen über `String` als Typ.  
**1. *Base URL for the file***  
Die Basis-URL ist die CloudFront URL, die Sie für den Zugriff auf die Datei verwenden würden, wenn Sie keine signierten verwenden würden URLs, einschließlich Ihrer eigenen Abfragezeichenfolge-Parameter, falls vorhanden. Im vorherigen Beispiel lautet die Basis-URL `https://d111111abcdef8.cloudfront.net/image.jpg`. Weitere Hinweise zum Format von URLs für Distributionen finden Sie unter[Anpassen des URL-Formats für Dateien in CloudFront](LinkFormat.md).  
   + Die folgende CloudFront URL bezieht sich auf eine Bilddatei in einer Distribution (unter Verwendung des CloudFront Domainnamens). Beachten Sie, dass `image.jpg` ein `images`-Verzeichnis ist. Der Pfad zur Datei in der URL muss mit dem Pfad zur Datei auf Ihrem HTTP-Server oder in Ihrem Amazon S3 Bucket übereinstimmen.

     `https://d111111abcdef8.cloudfront.net/images/image.jpg`
   + Die folgende CloudFront URL enthält eine Abfragezeichenfolge:

     `https://d111111abcdef8.cloudfront.net/images/image.jpg?size=large`
   + Die folgenden Informationen CloudFront URLs beziehen sich auf Bilddateien in einer Distribution. Beide verwenden einen alternativen Domainnamen. Die zweite enthält eine Abfragezeichenfolge:

     `https://www.example.com/images/image.jpg`

     `https://www.example.com/images/image.jpg?color=red`
   + Die folgende CloudFront URL bezieht sich auf eine Bilddatei in einer Distribution, die einen alternativen Domainnamen und das HTTPS-Protokoll verwendet:

     `https://www.example.com/images/image.jpg`  
** 2. `?`**  
`?` zeigt an, dass Abfrageparameter hinter der Basis-URL angegeben sind. Schließen Sie das `?` auch dann ein, wenn Sie keine Abfrageparameter angeben.  
Sie können die folgenden Abfrageparameter in beliebiger Reihenfolge angeben.  
**3. *Your query string parameters, if any*`&`**  
(Optional) Sie können Ihre eigenen Abfragezeichenfolgenparameter eingeben. Fügen Sie dazu zwischen jedem ein Et-Zeichen (`&`) hinzu, wie in `color=red&size=medium`. Sie können die Abfragezeichenfolgenparameter in beliebiger Reihenfolge innerhalb der URL angeben.  
Ihre Abfragezeichenparameter können nicht mit `Expires`, `Signature` oder `Key-Pair-Id` benannt werden.  
** 4. `Expires=`*date and time in Unix time format (in seconds) and Coordinated Universal Time (UTC)***  
Das Datum und die Uhrzeit, wann die URL den Zugriff auf die Datei nicht mehr zulassen soll.  
Geben Sie das Ablaufdatum und die Ablaufzeit im Unix-Zeitformat (in Sekunden) und in koordinierter Weltzeit (UTC) an. Beispielsweise wird der 1. Januar 2026, 10:00 Uhr UTC in das Unix-Zeitformat `1767290400` umgewandelt, wie im Beispiel am Anfang dieses Themas dargestellt.   
Um die Epochenzeit zu verwenden, geben Sie eine 64-Bit-Ganzzahl für ein Datum an, das nicht nach `9223372036854775807` (Freitag, 11. April 2262 um 23:47:16.854 UTC) liegt.  
  
Weitere Informationen zu UTC finden Sie unter [RFC 3339, Datum und Uhrzeit im Internet: Zeitstempel](https://tools.ietf.org/html/rfc3339).  
** 5. `&Signature=`*hashed and signed version of the policy statement***  
Eine gehashte, signierte und Base64-codierte Version der JSON-Richtlinienanweisung. Weitere Informationen finden Sie unter [Erstellen einer Signatur für eine signierte URL, die eine vordefinierte Richtlinie verwendet](#private-content-canned-policy-creating-signature).  
** 6. `&Key-Pair-Id=`*public key ID for the CloudFront public key whose corresponding private key you're using to generate the signature***  
Die ID für einen CloudFront öffentlichen Schlüssel, zum Beispiel`K2JCJMDEHXQW5F`. Die ID des öffentlichen Schlüssels gibt an CloudFront , welcher öffentliche Schlüssel zur Validierung der signierten URL verwendet werden soll. CloudFront vergleicht die Informationen in der Signatur mit den Informationen in der Richtlinienerklärung, um sicherzustellen, dass die URL nicht manipuliert wurde.  
Dieser öffentliche Schlüssel muss zu einer Schlüsselgruppe gehören, die ein vertrauenswürdiger Aussteller in der Distribution ist. Weitere Informationen finden Sie unter [Geben Sie Unterzeichner an, die signierte URLs und signierte Cookies erstellen können](private-content-trusted-signers.md).

## Erstellen einer Signatur für eine signierte URL, die eine vordefinierte Richtlinie verwendet
<a name="private-content-canned-policy-creating-signature"></a>

Zum Erstellen der Signatur für eine signierte URL, die eine vordefinierte Richtlinie verwendet, führen Sie die folgenden Schritte aus.

**Topics**
+ [Erstellen einer Richtlinienanweisung für eine signierte URL, die eine vordefinierte Richtlinie verwendet](#private-content-canned-policy-creating-policy-statement)
+ [Erstellen einer Signatur für eine signierte URL, die eine vordefinierte Richtlinie verwendet](#private-content-canned-policy-signing-policy-statement)

### Erstellen einer Richtlinienanweisung für eine signierte URL, die eine vordefinierte Richtlinie verwendet
<a name="private-content-canned-policy-creating-policy-statement"></a>

Wenn Sie eine signierte URL mit einer vordefinierten Richtlinie erstellen, ist der `Signature`-Parameter eine gehashte und signierte Version einer Richtlinienanweisung. Bei signierten URLs , die eine vorgefertigte Richtlinie verwenden, fügen Sie die Richtlinienanweisung nicht in die URL ein, wie dies bei signierten Richtlinien der Fall ist URLs , die eine benutzerdefinierte Richtlinie verwenden. Zum Erstellen der Richtlinienanweisung führen Sie die folgenden Schritte aus.<a name="private-content-canned-policy-creating-policy-statement-procedure"></a>

**So erstellen Sie die Richtlinienanweisung für eine signierte URL, die eine vordefinierte Richtlinie verwendet**

1. Erstellen Sie die Richtlinienanweisung unter Verwendung des folgenden JSON-Formats und der UTF-8-Zeichencodierung. Fügen Sie alle Satzzeichen und andere Literalwerte genau wie angegeben ein. Informationen zu den Parametern `Resource` und `DateLessThan` finden Sie unter [Werte, die Sie in der Richtlinienanweisung für eine signierte URL angeben, die eine vordefinierte Richtlinie verwendet](#private-content-canned-policy-statement-values).

   ```
   {
       "Statement": [
           {
               "Resource": "base URL or stream name",
               "Condition": {
                   "DateLessThan": {
                       "AWS:EpochTime": ending date and time in Unix time format and UTC
                   }
               }
           }
       ]
   }
   ```

1. Entfernen Sie alle Leerzeichen (einschließlich Tabulatoren und Zeilenumbruchzeichen) aus der Richtlinienanweisung. Möglicherweise müssen Sie in der Zeichenfolge im Anwendungscode Escape-Zeichen einfügen.

#### Werte, die Sie in der Richtlinienanweisung für eine signierte URL angeben, die eine vordefinierte Richtlinie verwendet
<a name="private-content-canned-policy-statement-values"></a>

Beim Erstellen einer Richtlinienanweisung für eine vordefinierte Richtlinie geben Sie die folgenden Werte an.

**Ressource**  
Sie können nur einen Wert für `Resource` angeben.
Die Basis-URL einschließlich Ihrer Abfragezeichenfolgen, sofern vorhanden, jedoch ohne die CloudFront `Expires` `Key-Pair-Id` Parameter`Signature`, und, zum Beispiel:  
`https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes`  
Beachten Sie Folgendes:  
+ **Protokoll** – Der Wert muss mit `http://` oder `https://` beginnen.
+ **Abfragezeichenfolgeparameter** – Wenn Sie über keine Abfragezeichenfolgeparameter verfügen, lassen Sie das Fragezeichen weg.
+ **Alternative Domänennamen** – Wenn Sie einen alternativen Domänennamen (CNAME) in der URL angeben, müssen Sie diesen alternativen Domänennamen angeben, wenn Sie auf Ihrer Webseite oder in Ihrer Anwendung auf die Datei verweisen. Geben Sie nicht die Amazon-S3-URL für das Objekt an.

**DateLessThan**  
Das Ablaufdatum und die Ablaufzeit für die URL im Unix-Zeitformat (in Sekunden) und in koordinierter Weltzeit (UTC). Beispielsweise wird der 1. Januar 2026, 10:00 Uhr UTC im Unix-Zeitformat in 1767290400 umgewandelt.  
Dieser Wert muss mit dem Wert des `Expires`-Abfragezeichenfolgeparameters in der signierten URL übereinstimmen. Setzen Sie den Wert nicht in Anführungszeichen.  
Weitere Informationen finden Sie unter [Wann CloudFront überprüft das Ablaufdatum und die Uhrzeit in einer signierten URL](private-content-signed-urls.md#private-content-check-expiration).

#### Beispiel-Richtlinienanweisung für eine signierte URL, die eine vordefinierte Richtlinie verwendet
<a name="private-content-canned-policy-creating-policy-statement-example"></a>

Wenn Sie die folgende Beispiel-Richtlinienanweisung in einer signierten URL verwenden, kann ein Benutzer bis zum 1. Januar 2026, 10:00 Uhr UTC, auf die Datei `https://d111111abcdef8.cloudfront.net/horizon.jpg` zugreifen:

```
{
    "Statement": [
        {
            "Resource": "https://d111111abcdef8.cloudfront.net/horizon.jpg?size=large&license=yes",
            "Condition": {
                "DateLessThan": {
                    "AWS:EpochTime": 1767290400
                }
            }
        }
    ]
}
```

### Erstellen einer Signatur für eine signierte URL, die eine vordefinierte Richtlinie verwendet
<a name="private-content-canned-policy-signing-policy-statement"></a>

Um den Wert für den Parameter `Signature` in einer signierten URL zu erstellen, müssen Sie die in [Erstellen einer Richtlinienanweisung für eine signierte URL, die eine vordefinierte Richtlinie verwendet](#private-content-canned-policy-creating-policy-statement) erstellte Richtlinienanweisung hashen und signieren.

Weitere Informationen und Beispiele für das Hashing, Signieren und Codieren der Richtlinienanweisung finden Sie unter:
+ [Linux-Befehle und OpenSSL für die Base64-Codierung und die Verschlüsselung](private-content-linux-openssl.md)
+ [Code-Beispiele für das Erstellen einer Signatur für eine signierte URL](PrivateCFSignatureCodeAndExamples.md)<a name="private-content-canned-policy-creating-signature-download-procedure"></a>

**Option 1: So erstellen Sie eine Signatur mithilfe einer vordefinierten Richtlinie**

1. Verwenden Sie die SHA-1-Hash-Funktion und den generierten privaten RSA- oder ECDSA-Schlüssel, um die im Verfahren [So erstellen Sie die Richtlinienanweisung für eine signierte URL, die eine vordefinierte Richtlinie verwendet](#private-content-canned-policy-creating-policy-statement-procedure) erstellte Richtlinienanweisung zu hashen und zu signieren. Verwenden Sie die Version der Richtlinienanweisung, die keine Leerzeichen mehr enthält.

   Verwenden Sie für den privaten Schlüssel, der für die Hash-Funktion erforderlich ist, einen privaten Schlüssel, dessen öffentlicher Schlüssel sich in einer aktiven vertrauenswürdigen Schlüsselgruppe für die Distribution befindet.
**Anmerkung**  
Die Methode, die Sie zum Hashen und Signieren der Richtlinienanweisung verwenden, ist abhängig von Ihrer Programmiersprache und Plattform. Einen Beispiel-Code finden Sie unter [Code-Beispiele für das Erstellen einer Signatur für eine signierte URL](PrivateCFSignatureCodeAndExamples.md).

1. Entfernen Sie die Leerzeichen (einschließlich Tabulatoren und Zeilenumbruchzeichen) aus der gehashten und signierten Zeichenfolge.

1. Nehmen Sie eine Base64-Codierung der Zeichenfolge mithilfe von MIME-Base64-Codierung vor. Weitere Informationen finden Sie in [Abschnitt 6.8, Base64 Content-Transfer-Encoding](https://tools.ietf.org/html/rfc2045#section-6.8) in *RFC 2045, MIME (Multipurpose Internet Mail Extensions), Teil 1: Format von Internet-Nachrichtentexten*.

1. Ersetzen Sie Zeichen, die in einer URL-Abfragezeichenfolge nicht gültig sind, durch gültige Zeichen. In der folgenden Tabelle sind ungültige und gültige Zeichen aufgelistet.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-canned-policy.html)

1. Fügen Sie den resultierenden Wert hinter `&Signature=` zu Ihrer signierten URL hinzu und kehren Sie zu [So erstellen Sie eine signierte URL mit einer vordefinierten Richtlinie](#private-content-creating-signed-url-canned-policy-procedure) zurück, um das Verketten der Teile Ihrer signierten URL abzuschließen.

# Erstellen einer signierten URL mit einer benutzerdefinierten Richtlinie
<a name="private-content-creating-signed-url-custom-policy"></a>

Um eine signierte URL mit einer benutzerdefinierten Richtlinie zu erstellen, führen Sie die folgenden Schritte aus.<a name="private-content-creating-signed-url-custom-policy-procedure"></a>

**So erstellen Sie eine signierte URL mit einer benutzerdefinierten Richtlinie**

1. Wenn Sie.NET oder Java verwenden, um signierte zu erstellen URLs, und wenn Sie den privaten Schlüssel für Ihr key pair nicht vom standardmäßigen .pem-Format in ein mit .NET oder Java kompatibles Format umformatiert haben, tun Sie dies jetzt. Weitere Informationen finden Sie unter [Neuformatierung des privaten Schlüssels (nur .NET und Java)](private-content-trusted-signers.md#private-content-reformatting-private-key).

1. Verketten Sie die folgenden Werte. Sie können das Format in diesem Beispiel für eine signierte URL verwenden.

   

   ```
   https://d111111abcdef8.cloudfront.net/image.jpg?color=red&size=medium&Policy=eyANCiAgICEXAMPLEW1lbnQiOiBbeyANCiAgICAgICJSZXNvdXJjZSI6Imh0dHA6Ly9kemJlc3FtN3VuMW0wLmNsb3VkZnJvbnQubmV0L2RlbW8ucGhwIiwgDQogICAgICAiQ29uZGl0aW9uIjp7IA0KICAgICAgICAgIklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIyMDcuMTcxLjE4MC4xMDEvMzIifSwNCiAgICAgICAgICJEYXRlR3JlYXRlclRoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTI5Njg2MDE3Nn0sDQogICAgICAgICAiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjEyOTY4NjAyMjZ9DQogICAgICB9IA0KICAgfV0gDQp9DQo&Signature=nitfHRCrtziwO2HwPfWw~yYDhUF5EwRunQA-j19DzZrvDh6hQ73lDx~-ar3UocvvRQVw6EkC~GdpGQyyOSKQim-TxAnW7d8F5Kkai9HVx0FIu-5jcQb0UEmatEXAMPLE3ReXySpLSMj0yCd3ZAB4UcBCAqEijkytL6f3fVYNGQI6&Key-Pair-Id=K2JCJMDEHXQW5F
   ```

   Entfernen Sie alle Leerzeichen (einschließlich Tabulatoren und Zeilenumbruchzeichen). Möglicherweise müssen Sie in der Zeichenfolge im Anwendungscode Escape-Zeichen einfügen. Alle Werte verfügen über `String` als Typ.  
**1. *Base URL for the file***  
Die Basis-URL ist die CloudFront URL, die Sie für den Zugriff auf die Datei verwenden würden, wenn Sie keine signierten verwenden würden URLs, einschließlich Ihrer eigenen Abfragezeichenfolge-Parameter, falls vorhanden. Im vorherigen Beispiel lautet die Basis-URL `https://d111111abcdef8.cloudfront.net/image.jpg`. Weitere Hinweise zum Format von URLs für Distributionen finden Sie unter[Anpassen des URL-Formats für Dateien in CloudFront](LinkFormat.md).  
Die folgenden Beispiele zeigen Werte, die Sie für Distributionen angeben.  
   + Die folgende CloudFront URL bezieht sich auf eine Bilddatei in einer Distribution (unter Verwendung des CloudFront Domainnamens). Beachten Sie, dass `image.jpg` ein `images`-Verzeichnis ist. Der Pfad zur Datei in der URL muss mit dem Pfad zur Datei auf Ihrem HTTP-Server oder in Ihrem Amazon S3 Bucket übereinstimmen.

     `https://d111111abcdef8.cloudfront.net/images/image.jpg`
   + Die folgende CloudFront URL enthält eine Abfragezeichenfolge:

     `https://d111111abcdef8.cloudfront.net/images/image.jpg?size=large`
   + Die folgenden Informationen CloudFront URLs beziehen sich auf Bilddateien in einer Distribution. Beide verwenden einen alternativen Domänennamen; die zweite enthält eine Abfragezeichenfolge:

     `https://www.example.com/images/image.jpg`

     `https://www.example.com/images/image.jpg?color=red`
   + Die folgende CloudFront URL bezieht sich auf eine Bilddatei in einer Distribution, die einen alternativen Domainnamen und das HTTPS-Protokoll verwendet:

     `https://www.example.com/images/image.jpg`  
**2. `?`**  
`?` zeigt an, dass Abfragezeichenfolgeparameter hinter der Basis-URL angegeben sind. Schließen Sie das `?` auch dann ein, wenn Sie keine Abfrageparameter angeben.  
Sie können die folgenden Abfrageparameter in beliebiger Reihenfolge angeben.  
**3. *Your query string parameters, if any*`&`**  
(Optional) Sie können Ihre eigenen Abfragezeichenfolgenparameter eingeben. Fügen Sie dazu zwischen jedem ein Et-Zeichen (&) hinzu, wie in `color=red&size=medium`. Sie können die Abfragezeichenfolgenparameter in beliebiger Reihenfolge innerhalb der URL angeben.  
Ihre Abfragezeichenparameter können nicht mit `Policy`, `Signature` oder `Key-Pair-Id` benannt werden.
Wenn Sie eigene Parameter hinzufügen, fügen Sie nach jedem Parameter ein `&` an, auch nach dem letzten.   
**4. `Policy=`*base64 encoded version of policy statement***  
Ihre Richtlinienanweisung im JSON-Format, wobei Leerzeichen entfernt wurden und eine Base64-Codierung vorgenommen wurde. Weitere Informationen finden Sie unter [Erstellen einer Richtlinienanweisung für eine signierte URL, die eine benutzerdefinierte Richtlinie verwendet](#private-content-custom-policy-statement).  
Die Richtlinienanweisung steuert den Zugriff, den eine signierte URL einem Benutzer gewährt. Sie enthält die URL der Datei, ein Ablaufdatum und eine Uhrzeit, ein optionales Datum und die Uhrzeit, zu der die URL gültig wird, und eine optionale IP-Adresse oder einen Bereich von IP-Adressen, die auf die Datei zugreifen dürfen.  
**5. `&Signature=`*hashed and signed version of the policy statement***  
Eine gehashte, signierte und Base64-codierte Version der JSON-Richtlinienanweisung. Weitere Informationen finden Sie unter [Erstellen einer Signatur für eine signierte URL, die eine benutzerdefinierte Richtlinie verwendet](#private-content-custom-policy-creating-signature).  
**6. `&Key-Pair-Id=`*public key ID for the CloudFront public key whose corresponding private key you're using to generate the signature***  
Die ID für einen CloudFront öffentlichen Schlüssel, zum Beispiel`K2JCJMDEHXQW5F`. Die ID des öffentlichen Schlüssels gibt an CloudFront, welcher öffentliche Schlüssel zur Validierung der signierten URL verwendet werden soll. CloudFrontvergleicht die Informationen in der Signatur mit den Informationen in der Richtlinienerklärung, um sicherzustellen, dass die URL nicht manipuliert wurde.  
Dieser öffentliche Schlüssel muss zu einer Schlüsselgruppe gehören, die ein vertrauenswürdiger Aussteller in der Distribution ist. Weitere Informationen finden Sie unter [Geben Sie Unterzeichner an, die signierte URLs und signierte Cookies erstellen können](private-content-trusted-signers.md).

## Erstellen einer Richtlinienanweisung für eine signierte URL, die eine benutzerdefinierte Richtlinie verwendet
<a name="private-content-custom-policy-statement"></a>

Führen Sie zum Erstellen einer Richtlinienanweisung für eine signierte URL, die eine benutzerdefinierte Richtlinie verwendet, die folgenden Schritte aus.

Einige Beispiele für Richtlinienanweisungen, die den Zugriff auf Dateien auf verschiedene Weisen kontrollieren, finden Sie unter [Beispiel-Richtlinienanweisungen für eine signierte URL, die eine benutzerdefinierte Richtlinie verwendet](#private-content-custom-policy-statement-examples).<a name="private-content-custom-policy-creating-policy-procedure"></a>

**So erstellen Sie die Richtlinienanweisung für eine signierte URL, die eine benutzerdefinierte Richtlinie verwendet**

1. Erstellen Sie die Richtlinienanweisung unter Verwendung des folgenden JSON-Formats. Ersetzen Sie die Symbole für „kleiner als“ (`<`) und „größer als“ (`>`) und die darin enthaltenen Beschreibungen durch Ihre eigenen Werte. Weitere Informationen finden Sie unter [Werte, die Sie in der Richtlinienanweisung für eine signierte URL angeben, die eine benutzerdefinierte Richtlinie verwendet](#private-content-custom-policy-statement-values).

   ```
   {
       "Statement": [
           {
               "Resource": "<Optional but recommended: URL of the file>",
               "Condition": {
                   "DateLessThan": {
   	                "AWS:EpochTime": <Required: ending date and time in Unix time format and UTC>
                   },
                   "DateGreaterThan": {
   	                "AWS:EpochTime": <Optional: beginning date and time in Unix time format and UTC>
                   },
                   "IpAddress": {
   	                "AWS:SourceIp": "<Optional: IP address>"
                   }
               }
           }
       ]
   }
   ```

   Beachten Sie Folgendes:
   + Sie können nur eine Anweisung in die Richtlinie aufnehmen.
   + Verwenden Sie UTF-8-Zeichencodierung.
   + Fügen Sie alle Satzzeichen und Parameternamen genau wie angegeben ein. Abkürzungen für Parameternamen werden nicht akzeptiert.
   + Die Reihenfolge der Parameter im Bereich `Condition` ist unerheblich.
   + Informationen zu den Werten für `Resource`, `DateLessThan`, `DateGreaterThan` und `IpAddress` finden Sie unter [Werte, die Sie in der Richtlinienanweisung für eine signierte URL angeben, die eine benutzerdefinierte Richtlinie verwendet](#private-content-custom-policy-statement-values).

1. Entfernen Sie alle Leerzeichen (einschließlich Tabulatoren und Zeilenumbruchzeichen) aus der Richtlinienanweisung. Möglicherweise müssen Sie in der Zeichenfolge im Anwendungscode Escape-Zeichen einfügen.

1. Nehmen Sie eine Base64-Codierung der Richtlinienanweisung mithilfe von MIME-Base64-Codierung vor. Weitere Informationen finden Sie in [Abschnitt 6.8, Base64 Content-Transfer-Encoding](https://tools.ietf.org/html/rfc2045#section-6.8) in *RFC 2045, MIME (Multipurpose Internet Mail Extensions), Teil 1: Format von Internet-Nachrichtentexten*.

1. Ersetzen Sie Zeichen, die in einer URL-Abfragezeichenfolge nicht gültig sind, durch gültige Zeichen. In der folgenden Tabelle sind ungültige und gültige Zeichen aufgelistet.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom-policy.html)

1. Fügen Sie den resultierenden Wert hinter zu Ihrer signierten URL hinz `Policy=`.

1. Erstellen Sie eine Signatur für die signierte URL, indem Sie die Richtlinienanweisung hashen, signieren und eine Base64-Codierung vornehmen. Weitere Informationen finden Sie unter [Erstellen einer Signatur für eine signierte URL, die eine benutzerdefinierte Richtlinie verwendet](#private-content-custom-policy-creating-signature).

### Werte, die Sie in der Richtlinienanweisung für eine signierte URL angeben, die eine benutzerdefinierte Richtlinie verwendet
<a name="private-content-custom-policy-statement-values"></a>

Beim Erstellen einer Richtlinienanweisung für eine benutzerdefinierte Richtlinie geben Sie die folgenden Werte an.

**Ressource**  
Die URL, einschließlich aller Abfragezeichenfolgen, jedoch ohne die Parameter CloudFront `Policy`, und`Signature`. `Key-Pair-Id` Beispiel:  
`https://d111111abcdef8.cloudfront.net/images/horizon.jpg\?size=large&license=yes`  
Sie können nur einen URL-Wert für `Resource` angeben.  
Sie können den `Resource`-Parameter in einer Richtlinie weglassen. Dies bedeutet jedoch, dass alle, die über die signierte URL verfügen, auf *alle* Dateien in *jeder* Distribution zugreifen können, die mit dem zum Erstellen der signierten URL verwendeten Schlüsselpaar verknüpft ist.
Beachten Sie Folgendes:  
+ **Protokoll** – Der Wert muss mit `http://`, `https://` oder `*://` beginnen.
+ **Parameter für die Abfragezeichenfolge** — Wenn die URL Abfragezeichenfolgenparameter enthält, verwenden Sie keinen umgekehrten Schrägstrich (`\`), um das Fragezeichen (`?`) zu umgehen, mit dem die Abfragezeichenfolge beginnt. Beispiel:

  `https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes`
+ **Platzhalterzeichen** – Sie können Platzhalterzeichen in der URL in der Richtlinie verwenden. Die folgenden Platzhalterzeichen werden unterstützt:
  + Sternchen (`*`) für null oder mehr Zeichen.
  + Fragezeichen (`?`) für genau ein Zeichen

  Wenn die URL in der Richtlinie mit der URL in der HTTP-Anforderung CloudFront übereinstimmt, ist die URL in der Richtlinie wie folgt in vier Abschnitte unterteilt: Protokoll, Domäne, Pfad und Abfragezeichenfolge:

  `[protocol]://[domain]/[path]\?[query string]`

  Wenn Sie in der URL in der Richtlinie ein Platzhalterzeichen verwenden, erfolgt der Platzhalterabgleich nur innerhalb der Grenzen des Abschnitts, der den Platzhalter enthält. Betrachten Sie etwa diese URL in einer Richtlinie:

  `https://www.example.com/hello*world`

  In diesem Beispiel gilt der Sternchen-Platzhalter (`*`) nur innerhalb des Pfadabschnitts, entspricht also dem URLs `https://www.example.com/helloworld` und`https://www.example.com/hello-world`, aber nicht der URL. `https://www.example.net/hello?world`

  Die folgenden Ausnahmen gelten beim Platzhalterabgleich für die Abschnittsgrenzen:
  + Ein nachfolgendes Sternchen im Pfadabschnitt impliziert ein Sternchen im Abschnitt mit der Abfragezeichenfolge. Beispiel: `http://example.com/hello*` ist gleichbedeutend mit `http://example.com/hello*\?*`.
  + Ein nachfolgendes Sternchen im Domainabschnitt impliziert ein Sternchen sowohl im Pfad- als auch im Abschnitt mit der Abfragezeichenfolge. Beispiel: `http://example.com*` ist gleichbedeutend mit `http://example.com*/*\?*`.
  + Eine URL in der Richtlinie kann den Protokollabschnitt weglassen und im Domainabschnitt mit einem Sternchen beginnen. In diesem Fall wird der Protokollabschnitt implizit auf ein Sternchen gesetzt. Beispielsweise entspricht die URL `*example.com` in einer Richtlinie `*://*example.com/`.
  + Ein Sternchen an sich (`"Resource": "*"`) entspricht jeder URL.

  Beispielsweise entspricht der Wert: `https://d111111abcdef8.cloudfront.net/*game_download.zip*` in einer Richtlinie allen folgenden Kriterien: URLs
  + `https://d111111abcdef8.cloudfront.net/game_download.zip`
  + `https://d111111abcdef8.cloudfront.net/example_game_download.zip?license=yes`
  + `https://d111111abcdef8.cloudfront.net/test_game_download.zip?license=temp`
+ **Alternative Domainnamen** – Wenn Sie einen alternativen Domainnamen (CNAME) in der URL in der Richtlinie angeben, muss die HTTP-Anfrage diesen alternativen Domainnamen auf Ihrer Webseite oder in Ihrer Anwendung verwenden. Geben Sie nicht die Amazon-S3-URL für die Datei in einer Richtlinie an.

**DateLessThan**  
Das Ablaufdatum und die Ablaufzeit für die URL im Unix-Zeitformat (in Sekunden) und in koordinierter Weltzeit (UTC). Setzen Sie in der Richtlinie den Wert nicht in Anführungszeichen. Weitere Informationen zu UTC finden Sie unter [Datum und Uhrzeit im Internet: Zeitstempel](https://tools.ietf.org/html/rfc3339).  
Beispielsweise wird der 31. Januar 2023, 10:00 Uhr UTC, im Unix-Zeitformat in 1675159200 konvertiert.  
Dies ist der einzige erforderliche Parameter in `Condition` diesem Abschnitt. CloudFront benötigt diesen Wert, um zu verhindern, dass Benutzer dauerhaft auf Ihre privaten Inhalte zugreifen können.  
Weitere Informationen finden Sie unter [Wann CloudFront überprüft das Ablaufdatum und die Uhrzeit in einer signierten URL](private-content-signed-urls.md#private-content-check-expiration).

**DateGreaterThan (Fakultativ)**  
Ein optionales Datum und eine optionale Zeit für die URL im Unix-Zeitformat (in Sekunden) und in koordinierter Weltzeit (UTC). Benutzer sind an oder vor dem angegebenen Datum und der angegebenen Zeit nicht berechtigt, auf die Datei zuzugreifen. Setzen Sie den Wert nicht in Anführungszeichen. 

**IpAddress (Fakultativ)**  
Die IP-Adresse des Clients, der die HTTP-Anfrage stellt. Beachten Sie Folgendes:  
+ Um allen IP-Adressen den Zugriff auf die Datei zu gewähren, lassen Sie den Parameter `IpAddress` weg.
+ Sie können entweder eine IP-Adresse oder einen IP-Adressbereich angeben. Sie können die Richtlinie nicht zum Gewähren von Zugriff verwenden, wenn sich die IP-Adresse des Clients in einem von zwei getrennten Bereichen befindet.
+ Um den Zugriff von einer einzigen IP-Adresse zu gewähren, geben Sie Folgendes an:

  `"`*IPv4 IP address*`/32"`
+ Sie müssen IP-Adressbereiche im IPv4 CIDR-Standardformat angeben (z. B.`192.0.2.0/24`). Weitere Informationen finden Sie unter [Classless Inter-domain Routing (CIDR): Internet-Adresszuweisung und Aggregierungsplan](https://tools.ietf.org/html/rfc4632).
**Wichtig**  
IP-Adressen im IPv6 Format 2001:0 db 8:85 a3: :8a2e: 0370:7334 werden nicht unterstützt. 

  Wenn Sie eine benutzerdefinierte Richtlinie verwenden, die Folgendes umfasst: Aktivieren Sie diese Option nicht für die Verteilung. `IpAddress` IPv6 Wenn Sie den Zugriff auf einige Inhalte anhand der IP-Adresse und IPv6 Supportanfragen für andere Inhalte einschränken möchten, können Sie zwei Distributionen erstellen. Weitere Informationen finden Sie unter [Aktivieren IPv6 (Zuschaueranfragen)](DownloadDistValuesGeneral.md#DownloadDistValuesEnableIPv6) im Thema [Referenz für alle Distributionseinstellungen](distribution-web-values-specify.md).

## Beispiel-Richtlinienanweisungen für eine signierte URL, die eine benutzerdefinierte Richtlinie verwendet
<a name="private-content-custom-policy-statement-examples"></a>

Die folgenden Beispiel-Richtlinienanweisungen zeigen, wie der Zugriff auf eine bestimmte Datei, auf alle Dateien in einem Verzeichnis oder auf alle mit einer Schlüsselpaar-ID verknüpften Dateien kontrolliert wird. Die Beispiele zeigen auch, wie der Zugriff von einer einzelnen IP-Adresse oder einem Bereich von IP-Adressen kontrolliert wird und wie Sie verhindern, dass Benutzer die signierte URL nach einem festgelegten Datum und einer festgelegten Zeit verwenden.

Wenn Sie eines dieser Beispiele kopieren und einfügen, entfernen Sie alle Leerzeichen (einschließlich Tabuloren und Zeilenumbruchzeichen), ersetzen Sie die entsprechenden Werte durch Ihre eigenen Werte und fügen Sie ein Zeilenumbruchzeichen hinter der schließenden Klammer (`}`) ein.

Weitere Informationen finden Sie unter [Werte, die Sie in der Richtlinienanweisung für eine signierte URL angeben, die eine benutzerdefinierte Richtlinie verwendet](#private-content-custom-policy-statement-values).

**Topics**
+ [Beispiel-Richtlinienanweisung: Zugriff auf eine Datei von einem Bereich von IP-Adressen aus](#private-content-custom-policy-statement-example-one-object)
+ [Beispiel-Richtlinienanweisung: Zugriff auf alle Dateien in einem Verzeichnis über einen Bereich von IP-Adressen](#private-content-custom-policy-statement-example-all-objects)
+ [Beispiel-Richtlinienanweisung: Zugriff auf alle mit einer Schlüsselpaar-ID verknüpften Dateien über eine IP-Adresse](#private-content-custom-policy-statement-example-one-ip)

### Beispiel-Richtlinienanweisung: Zugriff auf eine Datei von einem Bereich von IP-Adressen aus
<a name="private-content-custom-policy-statement-example-one-object"></a>

Das folgende Beispiel für eine Richtlinienanweisung in einer signierten URL legt fest, dass ein Benutzer bis zum 31. Januar 2013, 10:00 Uhr UTC, von IP-Adressen im Bereich `192.0.2.0/24` aus auf die Datei `https://d111111abcdef8.cloudfront.net/game_download.zip` zugreifen kann:

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

### Beispiel-Richtlinienanweisung: Zugriff auf alle Dateien in einem Verzeichnis über einen Bereich von IP-Adressen
<a name="private-content-custom-policy-statement-example-all-objects"></a>

Mit dem folgenden Beispiel einer benutzerdefinierten Richtlinie können Sie URLs für jede Datei im `training` Verzeichnis eine Signatur erstellen, wie durch das Sternchen-Platzhalterzeichen (`*`) im Parameter angegeben. `Resource` Benutzer können bis zum 31. Januar 2013, 10:00 Uhr UTC, von IP-Adressen im Bereich `192.0.2.0/24` aus auf die Datei zugreifen:

```
{
    "Statement": [
        {
            "Resource": "https://d111111abcdef8.cloudfront.net/training/*",
            "Condition": {
                "IpAddress": {
                    "AWS:SourceIp": "192.0.2.0/24"
                },
                "DateLessThan": {
                    "AWS:EpochTime": 1675159200
                }
            }
        }
    ]
}
```

Jede signierte URL, mit der Sie diese Richtlinie verwenden, enthält eine URL, die eine bestimmte Datei identifiziert, zum Beispiel:

`https://d111111abcdef8.cloudfront.net/training/orientation.pdf`

### Beispiel-Richtlinienanweisung: Zugriff auf alle mit einer Schlüsselpaar-ID verknüpften Dateien über eine IP-Adresse
<a name="private-content-custom-policy-statement-example-one-ip"></a>

Mit dem folgenden Beispiel einer benutzerdefinierten Richtlinie können Sie eine signierte Richtlinie URLs für jede Datei erstellen, die mit einer beliebigen Distribution verknüpft ist. Dies wird durch das Sternchen-Platzhalterzeichen (`*`) im Parameter angezeigt. `Resource` Die signierte URL muss das `https://`-Protokoll verwenden, nicht `http://`. Der Benutzer muss die IP-Adresse verwende `192.0.2.10/32`. (Der Wert `192.0.2.10/32` in CIDR-Notation bezieht sich auf eine einzelne IP-Adresse, `192.0.2.10`.) Die Dateien sind nur vom 31. Januar 2023, 10:00 Uhr UTC, bis zum 2. Februar 2023, 10:00 Uhr UTC, verfügbar:

```
{
    "Statement": [
       {
            "Resource": "https://*",
            "Condition": {
                "IpAddress": {
                    "AWS:SourceIp": "192.0.2.10/32"
                },
                "DateGreaterThan": {
                    "AWS:EpochTime": 1675159200
                },
                "DateLessThan": {
                    "AWS:EpochTime": 1675332000
                }
            }
        }
    ]
}
```

Jede signierte URL, mit der Sie diese Richtlinie verwenden, hat eine URL, die eine bestimmte Datei in einer bestimmten CloudFront Distribution identifiziert, zum Beispiel:

`https://d111111abcdef8.cloudfront.net/training/orientation.pdf`

Die signierte URL enthält auch eine Schlüsselpaar-ID, die mit einer vertrauenswürdigen Schlüsselgruppe in der Distribution (d111111abcdef8.cloudfront.net) verknüpft werden muss, die Sie in der URL angeben.

## Erstellen einer Signatur für eine signierte URL, die eine benutzerdefinierte Richtlinie verwendet
<a name="private-content-custom-policy-creating-signature"></a>

Bei der Signatur für eine signierte URL, die eine benutzerdefinierte Richtlinie verwendet, handelt es sich um eine gehashte, signierte und Base64-codierte Version der Richtlinienanweisung. Führen Sie die folgenden Schritte aus, um eine Signatur für eine benutzerdefinierte Richtlinie zu erstellen.

Weitere Informationen und Beispiele für das Hashing, Signieren und Codieren der Richtlinienanweisung finden Sie unter:
+ [Linux-Befehle und OpenSSL für die Base64-Codierung und die Verschlüsselung](private-content-linux-openssl.md)
+ [Code-Beispiele für das Erstellen einer Signatur für eine signierte URL](PrivateCFSignatureCodeAndExamples.md)<a name="private-content-custom-policy-creating-signature-download-procedure"></a>

**Option 1: So erstellen Sie eine Signatur mithilfe einer benutzerdefinierten Richtlinie**

1. Verwenden Sie die SHA-1-Hash-Funktion und den generierten privaten RSA- oder ECDSA-Schlüssel, um die im Verfahren [So erstellen Sie die Richtlinienanweisung für eine signierte URL, die eine benutzerdefinierte Richtlinie verwendet](#private-content-custom-policy-creating-policy-procedure) erstellte JSON-Richtlinienanweisung zu hashen und zu signieren. Verwenden Sie die Version der Richtlinienanweisung, die keine Leerzeichen mehr enthält, jedoch noch nicht Base64-codiert wurde.

   Verwenden Sie für den privaten Schlüssel, der für die Hash-Funktion erforderlich ist, einen privaten Schlüssel, dessen öffentlicher Schlüssel sich in einer aktiven vertrauenswürdigen Schlüsselgruppe für die Distribution befindet.
**Anmerkung**  
Die Methode, die Sie zum Hashen und Signieren der Richtlinienanweisung verwenden, ist abhängig von Ihrer Programmiersprache und Plattform. Einen Beispiel-Code finden Sie unter [Code-Beispiele für das Erstellen einer Signatur für eine signierte URL](PrivateCFSignatureCodeAndExamples.md).

1. Entfernen Sie die Leerzeichen (einschließlich Tabulatoren und Zeilenumbruchzeichen) aus der gehashten und signierten Zeichenfolge.

1. Nehmen Sie eine Base64-Codierung der Zeichenfolge mithilfe von MIME-Base64-Codierung vor. Weitere Informationen finden Sie in [Abschnitt 6.8, Base64 Content-Transfer-Encoding](https://tools.ietf.org/html/rfc2045#section-6.8) in *RFC 2045, MIME (Multipurpose Internet Mail Extensions), Teil 1: Format von Internet-Nachrichtentexten*.

1. Ersetzen Sie Zeichen, die in einer URL-Abfragezeichenfolge nicht gültig sind, durch gültige Zeichen. In der folgenden Tabelle sind ungültige und gültige Zeichen aufgelistet.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/AmazonCloudFront/latest/DeveloperGuide/private-content-creating-signed-url-custom-policy.html)

1. Fügen Sie den resultierenden Wert hinter `&Signature=` zu Ihrer signierten URL hinzu und kehren Sie zu [So erstellen Sie eine signierte URL mit einer benutzerdefinierten Richtlinie](#private-content-creating-signed-url-custom-policy-procedure) zurück, um das Verketten der Teile Ihrer signierten URL abzuschließen.

# Verwenden signierter Cookies
<a name="private-content-signed-cookies"></a>

CloudFront Mit signierten Cookies können Sie kontrollieren, wer auf Ihre Inhalte zugreifen kann, wenn Sie Ihre aktuellen Inhalte nicht ändern möchten URLs oder wenn Sie Zugriff auf mehrere eingeschränkte Dateien gewähren möchten, z. B. auf alle Dateien im Abonnentenbereich einer Website. In diesem Thema werden die Überlegungen bei der Verwendung von signierten Cookies erläutert und es wird beschrieben, wie signierte Cookies mithilfe von vordefinierten und benutzerdefinierten Richtlinien eingerichtet werden.

**Topics**
+ [Entscheidung zwischen vordefinierten und benutzerdefinierten Richtlinien für signierte Cookies](#private-content-choosing-canned-custom-cookies)
+ [Funktionsweise von signierten Cookies](#private-content-how-signed-cookies-work)
+ [Verhindern der missbräuchlichen Verwendung von signierten Cookies](#private-content-signed-cookie-misuse)
+ [When CloudFront überprüft das Ablaufdatum und die Uhrzeit in einem signierten Cookie](#private-content-check-expiration-cookie)
+ [Beispiel-Code und Drittanbieter-Tools](#private-content-overview-sample-code-cookies)
+ [Einrichten signierter Cookies mit einer vordefinierten Richtlinie](private-content-setting-signed-cookie-canned-policy.md)
+ [Einrichten signierter Cookies mit einer benutzerdefinierten Richtlinie](private-content-setting-signed-cookie-custom-policy.md)
+ [Erstellen signierter Cookies mit PHP](signed-cookies-PHP.md)

## Entscheidung zwischen vordefinierten und benutzerdefinierten Richtlinien für signierte Cookies
<a name="private-content-choosing-canned-custom-cookies"></a>

Wenn Sie ein signiertes Cookie erstellen, schreiben Sie eine Richtlinienanweisung im JSON-Format, welche die Einschränkungen für das signierte Cookie festlegt, z. B. wie lange das Cookie gültig ist. Sie können vordefinierte oder benutzerdefinierte Richtlinien verwenden. In der folgenden Tabelle werden vordefinierte und benutzerdefinierte Richtlinien verglichen:


****  

| Beschreibung | Vordefinierte Richtlinie | Benutzerdefinierte Richtlinie | 
| --- | --- | --- | 
| Sie können die Richtlinienanweisung für mehrere Dateien wiederverwenden. Um die Richtlinienanweisung wiederzuverwenden, müssen Sie Platzhalterzeichen im `Resource`-Objekt verwenden. Weitere Informationen finden Sie unter [Werte, die Sie in der Richtlinienanweisung für eine benutzerdefinierte Richtlinie für signierte Cookies angeben](private-content-setting-signed-cookie-custom-policy.md#private-content-custom-policy-statement-cookies-values).)  | Nein | Ja | 
| Sie können das Datum und die Zeit festlegen, ab denen Benutzer auf Ihre Inhalte zugreifen können. | Nein | Ja (optional) | 
| Sie können das Datum und die Zeit festlegen, ab denen Benutzer nicht mehr auf Ihre Inhalte zugreifen können. | Ja | Ja | 
| Sie können die IP-Adresse oder den Bereich von IP-Adressen der Benutzer festlegen, die auf Ihre Inhalte zugreifen können. | Nein | Ja (optional) | 

Informationen zum Erstellen von signierten Cookies mit einer vordefinierten Richtlinie finden Sie unter [Einrichten signierter Cookies mit einer vordefinierten Richtlinie](private-content-setting-signed-cookie-canned-policy.md).

Informationen zum Erstellen von signierten Cookies mit einer benutzerdefinierten Richtlinie finden Sie unter [Einrichten signierter Cookies mit einer benutzerdefinierten Richtlinie](private-content-setting-signed-cookie-custom-policy.md).

## Funktionsweise von signierten Cookies
<a name="private-content-how-signed-cookies-work"></a>

Hier finden Sie eine Übersicht darüber, wie Sie signierte Cookies konfigurieren CloudFront und wie Sie CloudFront reagieren, wenn ein Benutzer eine Anfrage einreicht, die ein signiertes Cookie enthält. 

1. Geben Sie in Ihrer CloudFront Distribution eine oder mehrere vertrauenswürdige Schlüsselgruppen an, die die öffentlichen Schlüssel enthalten, anhand derer die URL-Signatur überprüft werden CloudFront kann. Sie verwenden die entsprechenden privaten Schlüssel, um die zu signieren URLs.

   Weitere Informationen finden Sie unter [Geben Sie Unterzeichner an, die signierte URLs und signierte Cookies erstellen können](private-content-trusted-signers.md).

1. Sie entwickeln Ihre Anwendung so, dass ermittelt wird, ob ein Benutzer über Zugriff auf Ihre Inhalte verfügen sollte, und wenn dies der Fall ist, drei `Set-Cookie`-Header an den Viewer zu senden. (Jeder `Set-Cookie` Header kann nur ein Name-Wert-Paar enthalten, und ein CloudFront signiertes Cookie benötigt drei Name-Wert-Paare.) Sie müssen die `Set-Cookie`-Header an den Viewer senden, bevor der Viewer Ihre privaten Inhalte anfragt. Wenn Sie eine kurze Ablaufzeit für das Cookie angeben, möchten Sie vielleicht auch drei weitere `Set-Cookie`-Header als Reaktion auf folgende Anfragen senden, sodass der Benutzer weiterhin Zugriff hat.

   In der Regel weist Ihre CloudFront Distribution mindestens zwei Cache-Verhaltensweisen auf, eines, für das keine Authentifizierung erforderlich ist, und eines, für das eine Authentifizierung erforderlich ist. Die Fehlerseite für den sicheren Teil der Website enthält eine Weiterleitung oder einen Link zu einer Anmeldeseite.

   Wenn Sie Ihre Distribution so konfigurieren, dass Dateien zwischengespeichert werden, die auf Cookies basieren, werden separate Dateien CloudFront nicht zwischengespeichert, die auf den Attributen in signierten Cookies basieren.

1. Ein Benutzer meldet sich auf Ihrer Website an und bezahlt entweder für Inhalte oder erfüllt andere Anforderungen für den Zugriff.

1. Ihre Anwendung gibt die `Set-Cookie`-Header in der Antwort zurück und der Viewer speichert die Name-Wert-Paare.

1. Der Benutzer fordert eine Datei an.

   Der Browser des Benutzers oder ein anderer Viewer ruft die Name-Wert-Paare aus Schritt 4 ab und fügt sie zu der Anfrage in einem `Cookie`-Header hinzu. Dies ist das signierte Cookie.

1. CloudFront verwendet den öffentlichen Schlüssel, um die Signatur im signierten Cookie zu validieren und um zu bestätigen, dass das Cookie nicht manipuliert wurde. Wenn die Signatur ungültig ist, wird die Anfrage abgelehnt.

   Wenn die Signatur im Cookie gültig ist, überprüft CloudFront die Richtlinienerklärung im Cookie (oder erstellt eine, wenn Sie eine vordefinierte Richtlinie verwenden), um zu bestätigen, dass die Anfrage noch gültig ist. Wenn Sie beispielsweise ein Anfangs- und Enddatum und eine Uhrzeit für das Cookie angegeben haben, wird CloudFront bestätigt, dass der Benutzer während des Zeitraums, für den Sie den Zugriff zulassen möchten, versucht, auf Ihre Inhalte zuzugreifen.

   Wenn die Anfrage die Anforderungen der Richtlinienerklärung CloudFront erfüllt, wird Ihr Inhalt genauso bereitgestellt wie bei Inhalten, für die keine Einschränkungen gelten: Es wird festgestellt, ob sich die Datei bereits im Edge-Cache befindet, leitet die Anfrage gegebenenfalls an den Ursprung weiter und gibt die Datei an den Benutzer zurück.

## Verhindern der missbräuchlichen Verwendung von signierten Cookies
<a name="private-content-signed-cookie-misuse"></a>

Wenn Sie den `Domain`-Parameter in einem `Set-Cookie`-Header angeben, geben Sie einen möglichst genauen Wert ein, um das Potenzial für den Zugriff durch einen Benutzer mit demselben Stammdomänennamen zu verringern. Beispielsweise ist app.example.com gegenüber example.com vorzuziehen – insbesondere, wenn Sie example.com nicht kontrollieren. Dadurch können Sie verhindern, dass ein Benutzer von www.example.com aus auf Ihre Inhalte zugreift.

Gehen Sie wie folgt vor, um diese Art von Angriff zu verhindern:
+ Schließen Sie die Cookie-Attribute `Expires` und `Max-Age` aus, damit der `Set-Cookie`-Header ein Sitzungs-Cookie erstellt. Sitzungs-Cookies werden automatisch gelöscht, wenn der Benutzer den Browser schließt. Dies verringert das Risiko, dass ein Benutzer unbefugten Zugriff auf Ihre Inhalte erhält.
+ Fügen Sie das Attribut `Secure` ein, damit das Cookie verschlüsselt wird, wenn ein Viewer es in eine Anfrage einfügt.
+ Verwenden Sie wenn möglich eine benutzerdefinierte Richtlinie und fügen Sie die IP-Adresse des Viewers ein.
+ Geben Sie auf der Grundlage davon, wie lange Sie Benutzern Zugriff auf Ihre Inhalte gewähren möchten, im Attribut `CloudFront-Expires` eine möglichst kurze, vernünftige Ablaufzeit an.

## When CloudFront überprüft das Ablaufdatum und die Uhrzeit in einem signierten Cookie
<a name="private-content-check-expiration-cookie"></a>

Um festzustellen, ob ein signiertes Cookie noch gültig ist, werden das Ablaufdatum und die Uhrzeit im Cookie zum Zeitpunkt der HTTP-Anfrage CloudFront überprüft. Wenn ein Client unmittelbar vor der Ablaufzeit mit dem Download einer großen Datei beginnt, sollte der Download abgeschlossen werden, auch wenn die Ablaufzeit während des Downloads überschritten wird. Wenn die TCP-Verbindung getrennt wird und der Client nach Überschreitung der Ablaufzeit versucht, den Download erneut zu starten, schlägt der Download fehl.

Wenn ein Client Range verwendet GETs , um eine Datei in kleineren Teilen abzurufen, schlägt jede GET-Anforderung fehl, die nach Ablauf der Ablaufzeit erfolgt. Weitere Informationen zu Range GETs finden Sie unter[Wie CloudFront werden Teilanfragen für ein Objekt (BereichGETs) verarbeitet](RangeGETs.md).

## Beispiel-Code und Drittanbieter-Tools
<a name="private-content-overview-sample-code-cookies"></a>

Der Beispielcode für private Inhalte zeigt nur, wie die Signatur für signierte Inhalte erstellt wird URLs. Das Erstellen einer Signatur für ein signiertes Cookie ist jedoch sehr ähnlich, deshalb ist ein Großteil des Beispiel-Codes auch hier von Bedeutung. Weitere Informationen finden Sie unter den folgenden Themen: 
+ [Erstellen einer URL-Signatur mit Perl](CreateURLPerl.md)
+ [Erstellen einer URL-Signatur mit PHP](CreateURL_PHP.md)
+ [Erstellen einer URL-Signatur mithilfe von C\$1 und dem .NET Framework](CreateSignatureInCSharp.md)
+ [Erstellen einer URL-Signatur mit Java](CFPrivateDistJavaDevelopment.md)

# Einrichten signierter Cookies mit einer vordefinierten Richtlinie
<a name="private-content-setting-signed-cookie-canned-policy"></a>

Um ein signiertes Cookie mit einer vordefinierten Richtlinie einzurichten, führen Sie die folgenden Schritte aus. Zum Erstellen einer Signatur vgl. [Erstellen einer Signatur für ein signiertes Cookie, das eine vordefinierte Richtlinie verwendet](#private-content-canned-policy-signature-cookies).<a name="private-content-setting-signed-cookie-canned-policy-procedure"></a>

**So richten Sie ein signiertes Cookies mit einer vordefinierten Richtlinie ein**

1. Wenn Sie .NET oder Java verwenden, um signierte Cookies zu erstellen, und den privaten Schlüssel für Ihr Schlüsselpaar noch nicht vom PEM-Standardformat in ein mit .NET oder Java kompatibles Format neu formatiert haben, holen Sie diesen Schritt jetzt nach. Weitere Informationen finden Sie unter [Neuformatierung des privaten Schlüssels (nur .NET und Java)](private-content-trusted-signers.md#private-content-reformatting-private-key).

1. Programmieren Sie Ihre Anwendung so, dass drei `Set-Cookie`-Header an genehmigte Viewer gesendet werden. Sie benötigen drei `Set-Cookie`-Header, weil jeder `Set-Cookie`-Header nur ein Name-Wert-Paar enthalten kann und ein CloudFront -signiertes Cookie drei Name-Wert-Paare erfordert. Die Name-Wert-Paare sind: `CloudFront-Expires`, `CloudFront-Signature` und `CloudFront-Key-Pair-Id`. Die Werte müssen auf dem Viewer vorhanden sein, bevor ein Benutzer die erste Anfrage für eine Datei stellt, bei der der Zugriff kontrolliert werden soll. 
**Anmerkung**  
Im Allgemeinen empfehlen wir, die Attribute `Expires` und `Max-Age` auszuschließen. Der Ausschluss der Attribute bewirkt, dass der Browser das Cookie löscht, wenn der Benutzer den Browser schließt. Dies verringert das Risiko, dass ein Benutzer unbefugten Zugriff auf Ihre Inhalte erhält. Weitere Informationen finden Sie unter [Verhindern der missbräuchlichen Verwendung von signierten Cookies](private-content-signed-cookies.md#private-content-signed-cookie-misuse).

   **Bei den Namen der Cookie-Attribute muss die Groß- und Kleinschreibung beachtet werden**. 

   Zeilenumbrüche werden nur hinzugefügt, damit die Attribute besser lesbar sind.

   ```
   Set-Cookie: 
   CloudFront-Expires=date and time in Unix time format (in seconds) and Coordinated Universal Time (UTC); 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   
   Set-Cookie: 
   CloudFront-Signature=hashed and signed version of the policy statement; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   
   Set-Cookie: 
   CloudFront-Key-Pair-Id=public key ID for the CloudFront public key whose corresponding private key you're using to generate the signature; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   ```  
**(Optional) `Domain`**  
Der Domänenname für die angeforderte Datei. Wenn Sie kein `Domain`-Attribut angeben, ist der Standardwert der Domänenname in der URL und dieser gilt nur für die angegebenen Domänennamen, nicht für Unterdomänen. Wenn Sie ein `Domain`-Attribut angeben, gilt dieses auch für Unterdomänen. Ein vorangestellter Punkt im Domänennamen (z. B. `Domain=.example.com`) ist optional. Wenn Sie ein `Domain`-Attribut angeben, müssen darüber hinaus der Domänenname in der URL und der Wert des `Domain`-Attributs übereinstimmen.  
Sie können den Domainnamen angeben, der Ihrer Distribution CloudFront zugewiesen wurde, z. B. d111111abcdef8.cloudfront.net, aber Sie können nicht \$1.cloudfront.net für den Domainnamen angeben.  
Wenn Sie einen alternativen Domainnamen wie example.com in verwenden möchten, müssen Sie den alternativen Domainnamen zu Ihrer Distribution hinzufügen URLs, unabhängig davon, ob Sie das Attribut angeben. `Domain` Weitere Informationen finden Sie unter [Alternative Domainnamen (CNAMEs)](DownloadDistValuesGeneral.md#DownloadDistValuesCNAME) im Thema [Referenz für alle Distributionseinstellungen](distribution-web-values-specify.md).  
**(Optional) `Path`**  
Der Pfad für die angeforderte Datei. Wenn Sie kein `Path`-Attribut angeben, ist der Standardwert der Pfad in der URL.  
**`Secure`**  
Macht es erforderlich, dass der Viewer Cookies vor dem Senden einer Anfrage verschlüsselt. Wir empfehlen, den `Set-Cookie` Header über eine HTTPS-Verbindung zu senden, um sicherzustellen, dass die Cookie-Attribute vor man-in-the-middle Angriffen geschützt sind.  
**`HttpOnly`**  
Definiert, wie der Browser (sofern unterstützt) mit dem Cookie-Wert interagiert. Mit`HttpOnly`, auf die Cookie-Werte kann nicht zugegriffen werden JavaScript. Diese Vorsichtsmaßnahme kann dazu beitragen, Cross-Site-Scripting (XSS)-Angriffe abzuwehren. Weitere Informationen finden Sie unter [Verwenden von HTTP-Cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies).  
**`CloudFront-Expires`**  
Geben Sie das Ablaufdatum und die Ablaufzeit im Unix-Zeitformat (in Sekunden) und in koordinierter Weltzeit (UTC) an. Beispielsweise wird der 1. Januar 2026, 10:00 Uhr UTC im Unix-Zeitformat in 1767290400 umgewandelt.   
Um die Epochenzeit zu verwenden, geben Sie eine 64-Bit-Ganzzahl für ein Datum an, das nicht nach `9223372036854775807` (Freitag, 11. April 2262 um 23:47:16.854 UTC) liegt.  
Weitere Informationen zu UTC finden Sie unter *RFC 3339, Datum und Uhrzeit im Internet: Zeitstempel*, [https://tools.ietf.org/html/rfc3339](https://tools.ietf.org/html/rfc3339).  
**`CloudFront-Signature`**  
Eine gehashte, signierte und Base64-codierte Version einer JSON-Richtlinienanweisung. Weitere Informationen finden Sie unter [Erstellen einer Signatur für ein signiertes Cookie, das eine vordefinierte Richtlinie verwendet](#private-content-canned-policy-signature-cookies).  
**`CloudFront-Key-Pair-Id`**  
Die ID für einen CloudFront öffentlichen Schlüssel, zum Beispiel. `K2JCJMDEHXQW5F` Die ID des öffentlichen Schlüssels gibt an CloudFront , welcher öffentliche Schlüssel zur Validierung der signierten URL verwendet werden soll. CloudFront vergleicht die Informationen in der Signatur mit den Informationen in der Richtlinienerklärung, um sicherzustellen, dass die URL nicht manipuliert wurde.  
Dieser öffentliche Schlüssel muss zu einer Schlüsselgruppe gehören, die ein vertrauenswürdiger Aussteller in der Distribution ist. Weitere Informationen finden Sie unter [Geben Sie Unterzeichner an, die signierte URLs und signierte Cookies erstellen können](private-content-trusted-signers.md).

Das folgende Beispiel zeigt `Set-Cookie` Header für ein signiertes Cookie, wenn Sie den Domainnamen verwenden, der Ihrer Distribution zugeordnet ist, in Ihren URLs Dateien:

```
Set-Cookie: CloudFront-Expires=1426500000; Domain=d111111abcdef8.cloudfront.net; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=yXrSIgyQoeE4FBI4eMKF6ho~CA8_; Domain=d111111abcdef8.cloudfront.net; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=d111111abcdef8.cloudfront.net; Path=/images/*; Secure; HttpOnly
```

Das folgende Beispiel zeigt `Set-Cookie` Header für ein signiertes Cookie, wenn Sie den alternativen Domainnamen example.org in Ihren Dateien verwenden: URLs 

```
Set-Cookie: CloudFront-Expires=1426500000; Domain=example.org; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=yXrSIgyQoeE4FBI4eMKF6ho~CA8_; Domain=example.org; Path=/images/*; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=example.org; Path=/images/*; Secure; HttpOnly
```

Wenn Sie einen alternativen Domainnamen wie example.com in verwenden möchten URLs, müssen Sie den alternativen Domainnamen zu Ihrer Distribution hinzufügen, unabhängig davon, ob Sie das Attribut angeben. `Domain` Weitere Informationen finden Sie unter [Alternative Domainnamen (CNAMEs)](DownloadDistValuesGeneral.md#DownloadDistValuesCNAME) im Thema [Referenz für alle Distributionseinstellungen](distribution-web-values-specify.md).

## Erstellen einer Signatur für ein signiertes Cookie, das eine vordefinierte Richtlinie verwendet
<a name="private-content-canned-policy-signature-cookies"></a>

Zum Erstellen der Signatur für ein signiertes Cookie, das eine vordefinierte Richtlinie verwendet, führen Sie die folgenden Schritte aus.

**Topics**
+ [Erstellen einer Richtlinienanweisung für ein signiertes Cookie, das eine vordefinierte Richtlinie verwendet](#private-content-canned-policy-statement-cookies)
+ [Signieren der Richtlinienanweisung zum Erstellen einer Signatur für ein signiertes Cookie, das eine vordefinierte Richtlinie verwendet](#private-content-canned-policy-cookies-signing-policy-statement)

### Erstellen einer Richtlinienanweisung für ein signiertes Cookie, das eine vordefinierte Richtlinie verwendet
<a name="private-content-canned-policy-statement-cookies"></a>

Wenn Sie ein signiertes Cookie einrichten, das eine vordefinierte Richtlinie verwendet, ist das `CloudFront-Signature`-Attribut eine gehashte und signierte Version einer Richtlinienanweisung. Bei signierten Cookies, die eine vordefinierte Richtlinie verwenden, fügen Sie die Richtlinienanweisung nicht in den `Set-Cookie`-Header ein, wie Sie es bei signierten Cookies tun, die eine benutzerdefinierte Richtlinie verwenden. Führen Sie die folgenden Schritte aus, um die Richtlinienanweisung zu erstellen.<a name="private-content-canned-policy-statement-cookies-procedure"></a>

**So erstellen Sie eine Richtlinienanweisung für ein signiertes Cookie, das eine vordefinierte Richtlinie verwendet**

1. Erstellen Sie die Richtlinienanweisung unter Verwendung des folgenden JSON-Formats und der UTF-8-Zeichencodierung. Fügen Sie alle Satzzeichen und andere Literalwerte genau wie angegeben ein. Informationen zu den Parametern `Resource` und `DateLessThan` finden Sie unter [Werte, die Sie in der Richtlinienanweisung für eine vordefinierte Richtlinie für signierte Cookies angeben](#private-content-canned-policy-statement-cookies-values).

   ```
   {
       "Statement": [
           {
               "Resource": "base URL or stream name",
               "Condition": {
                   "DateLessThan": {
                       "AWS:EpochTime": ending date and time in Unix time format and UTC
                   }
               }
           }
       ]
   }
   ```

1. Entfernen Sie alle Leerzeichen (einschließlich Tabulatoren und Zeilenumbruchzeichen) aus der Richtlinienanweisung. Möglicherweise müssen Sie in der Zeichenfolge im Anwendungscode Escape-Zeichen einfügen.

#### Werte, die Sie in der Richtlinienanweisung für eine vordefinierte Richtlinie für signierte Cookies angeben
<a name="private-content-canned-policy-statement-cookies-values"></a>

Beim Erstellen einer Richtlinienanweisung für eine vordefinierte Richtlinie geben Sie die folgenden Werte an:

**Ressource**  
Die Basis-URL einschließlich Ihrer Abfragezeichenfolgen, sofern vorhanden, zum Beispiel:  
`https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes`  
Sie können nur einen Wert für `Resource` angeben.  
Beachten Sie Folgendes:  
+ **Protokoll** – Der Wert muss mit `http://` oder `https://` beginnen.
+ **Abfragezeichenfolgeparameter** – Wenn Sie über keine Abfragezeichenfolgeparameter verfügen, lassen Sie das Fragezeichen weg.
+ **Alternative Domänennamen** – Wenn Sie einen alternativen Domänennamen (CNAME) in der URL angeben, müssen Sie diesen alternativen Domänennamen angeben, wenn Sie auf Ihrer Webseite oder in Ihrer Anwendung auf die Datei verweisen. Geben Sie nicht die Amazon S3-URL für Datei an.

**DateLessThan**  
Das Ablaufdatum und die Ablaufzeit für die URL im Unix-Zeitformat (in Sekunden) und in koordinierter Weltzeit (UTC). Setzen Sie den Wert nicht in Anführungszeichen.  
Beispielsweise wird der 16. März 2015, 10:00 Uhr UTC in 1426500000 im Unix-Zeitformat umgewandelt.  
Dieser Wert muss mit dem Wert des `CloudFront-Expires`-Attributs im `Set-Cookie`-Header übereinstimmen. Setzen Sie den Wert nicht in Anführungszeichen.  
Weitere Informationen finden Sie unter [When CloudFront überprüft das Ablaufdatum und die Uhrzeit in einem signierten Cookie](private-content-signed-cookies.md#private-content-check-expiration-cookie).

#### Beispiel-Richtlinienanweisung für eine vordefinierte Richtlinie
<a name="private-content-canned-policy-cookies-sample-policy-statement"></a>

Wenn Sie die folgende Beispiel-Richtlinienanweisung in einem signierten Cookie verwenden, kann ein Benutzer bis zum 16. März 2015, 10:00 Uhr UTC, auf die Datei `https://d111111abcdef8.cloudfront.net/horizon.jpg` zugreifen:

```
{
    "Statement": [
        {
            "Resource": "https://d111111abcdef8.cloudfront.net/horizon.jpg?size=large&license=yes",
            "Condition": {
                "DateLessThan": {
                    "AWS:EpochTime": 1426500000
                }
            }
        }
    ]
}
```

### Signieren der Richtlinienanweisung zum Erstellen einer Signatur für ein signiertes Cookie, das eine vordefinierte Richtlinie verwendet
<a name="private-content-canned-policy-cookies-signing-policy-statement"></a>

Um den Wert für das `CloudFront-Signature`-Attribut in einem `Set-Cookie`-Header zu erstellen, müssen Sie die in [So erstellen Sie eine Richtlinienanweisung für ein signiertes Cookie, das eine vordefinierte Richtlinie verwendet](#private-content-canned-policy-statement-cookies-procedure) erstellte Richtlinienanweisung hashen und signieren. 

Weitere Informationen und Beispiele für das Hashing, Signieren und Codieren der Richtlinienanweisung finden Sie in den folgenden Themen:
+ [Linux-Befehle und OpenSSL für die Base64-Codierung und die Verschlüsselung](private-content-linux-openssl.md)
+ [Code-Beispiele für das Erstellen einer Signatur für eine signierte URL](PrivateCFSignatureCodeAndExamples.md)<a name="private-content-canned-policy-cookie-creating-signature-procedure"></a>

**So erstellen Sie eine Signatur für ein signiertes Cookie mit einer vordefinierten Richtlinie**

1. Verwenden Sie die SHA-1-Hash-Funktion und RSA, um die im Verfahren [So erstellen Sie eine Richtlinienanweisung für ein signiertes Cookie, das eine vordefinierte Richtlinie verwendet](#private-content-canned-policy-statement-cookies-procedure) erstellte Richtlinienanweisung zu hashen und zu signieren. Verwenden Sie die Version der Richtlinienanweisung, die keine Leerzeichen mehr enthält.

   Verwenden Sie für den privaten Schlüssel, der für die Hash-Funktion erforderlich ist, einen privaten Schlüssel, dessen öffentlicher Schlüssel sich in einer aktiven vertrauenswürdigen Schlüsselgruppe für die Distribution befindet.
**Anmerkung**  
Die Methode, die Sie zum Hashen und Signieren der Richtlinienanweisung verwenden, ist abhängig von Ihrer Programmiersprache und Plattform. Einen Beispiel-Code finden Sie unter [Code-Beispiele für das Erstellen einer Signatur für eine signierte URL](PrivateCFSignatureCodeAndExamples.md).

1. Entfernen Sie die Leerzeichen (einschließlich Tabulatoren und Zeilenumbruchzeichen) aus der gehashten und signierten Zeichenfolge.

1. Nehmen Sie eine Base64-Codierung der Zeichenfolge mithilfe von MIME-Base64-Codierung vor. Weitere Informationen finden Sie in [Abschnitt 6.8, Base64 Content-Transfer-Encoding](https://tools.ietf.org/html/rfc2045#section-6.8) in *RFC 2045, MIME (Multipurpose Internet Mail Extensions), Teil 1: Format von Internet-Nachrichtentexten*.

1. Ersetzen Sie Zeichen, die in einer URL-Abfragezeichenfolge nicht gültig sind, durch gültige Zeichen. In der folgenden Tabelle sind ungültige und gültige Zeichen aufgelistet.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/AmazonCloudFront/latest/DeveloperGuide/private-content-setting-signed-cookie-canned-policy.html)

1. Fügen Sie den resultierenden Wert im `Set-Cookie`-Header für das `CloudFront-Signature`-Name-Wert-Paar ein. Kehren Sie anschließend zu [So richten Sie ein signiertes Cookies mit einer vordefinierten Richtlinie ein](#private-content-setting-signed-cookie-canned-policy-procedure) zurück und fügen Sie den `Set-Cookie`-Header für `CloudFront-Key-Pair-Id` hinzu.

# Einrichten signierter Cookies mit einer benutzerdefinierten Richtlinie
<a name="private-content-setting-signed-cookie-custom-policy"></a>

Führen Sie die folgenden Schritte aus, um ein signiertes Cookie einzurichten, das eine benutzerdefinierte Richtlinie verwendet:<a name="private-content-setting-signed-cookie-custom-policy-procedure"></a>

**So richten Sie ein signiertes Cookies mit einer benutzerdefinierten Richtlinie ein**

1. Wenn Sie.NET oder Java verwenden, um signierte zu erstellen URLs, und wenn Sie den privaten Schlüssel für Ihr key pair nicht vom standardmäßigen .pem-Format in ein mit .NET oder Java kompatibles Format umformatiert haben, tun Sie dies jetzt. Weitere Informationen finden Sie unter [Neuformatierung des privaten Schlüssels (nur .NET und Java)](private-content-trusted-signers.md#private-content-reformatting-private-key).

1. Programmieren Sie Ihre Anwendung so, dass drei `Set-Cookie`-Header an genehmigte Viewer gesendet werden. Sie benötigen drei `Set-Cookie` Header, da jeder `Set-Cookie` Header nur ein Name-Wert-Paar enthalten kann und ein CloudFront signiertes Cookie drei Name-Wert-Paare benötigt. Die Name-Wert-Paare sind: `CloudFront-Policy`, `CloudFront-Signature` und `CloudFront-Key-Pair-Id`. Die Werte müssen auf dem Viewer vorhanden sein, bevor ein Benutzer die erste Anfrage für eine Datei stellt, bei der der Zugriff kontrolliert werden soll. 
**Anmerkung**  
Im Allgemeinen empfehlen wir, die Attribute `Expires` und `Max-Age` auszuschließen. Dies bewirkt, dass der Browser das Cookie löscht, wenn der Benutzer den Browser schließt. Dies verringert das Risiko, dass ein Benutzer unbefugten Zugriff auf Ihre Inhalte erhält. Weitere Informationen finden Sie unter [Verhindern der missbräuchlichen Verwendung von signierten Cookies](private-content-signed-cookies.md#private-content-signed-cookie-misuse).

   **Bei den Namen der Cookie-Attribute muss die Groß- und Kleinschreibung beachtet werden**. 

   Zeilenumbrüche werden nur hinzugefügt, damit die Attribute besser lesbar sind.

   ```
   Set-Cookie: 
   CloudFront-Policy=base64 encoded version of the policy statement; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   
   
   Set-Cookie: 
   CloudFront-Signature=hashed and signed version of the policy statement; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   
   Set-Cookie: 
   CloudFront-Key-Pair-Id=public key ID for the CloudFront public key whose corresponding private key you're using to generate the signature; 
   Domain=optional domain name; 
   Path=/optional directory path; 
   Secure; 
   HttpOnly
   ```  
**(Optional) `Domain`**  
Der Domänenname für die angeforderte Datei. Wenn Sie kein `Domain`-Attribut angeben, ist der Standardwert der Domänenname in der URL und dieser gilt nur für die angegebenen Domänennamen, nicht für Unterdomänen. Wenn Sie ein `Domain`-Attribut angeben, gilt dieses auch für Unterdomänen. Ein vorangestellter Punkt im Domänennamen (z. B. `Domain=.example.com`) ist optional. Wenn Sie ein `Domain`-Attribut angeben, müssen darüber hinaus der Domänenname in der URL und der Wert des `Domain`-Attributs übereinstimmen.  
Sie können den Domainnamen angeben, der Ihrer Distribution CloudFront zugewiesen wurde, z. B. d111111abcdef8.cloudfront.net, aber Sie können nicht \$1.cloudfront.net für den Domainnamen angeben.  
Wenn Sie einen alternativen Domainnamen wie example.com in verwenden möchten, müssen Sie den alternativen Domainnamen zu Ihrer Distribution hinzufügen URLs, unabhängig davon, ob Sie das Attribut angeben. `Domain` Weitere Informationen finden Sie unter [Alternative Domainnamen (CNAMEs)](DownloadDistValuesGeneral.md#DownloadDistValuesCNAME) im Thema [Referenz für alle Distributionseinstellungen](distribution-web-values-specify.md).  
**(Optional) `Path`**  
Der Pfad für die angeforderte Datei. Wenn Sie kein `Path`-Attribut angeben, ist der Standardwert der Pfad in der URL.  
**`Secure`**  
Macht es erforderlich, dass der Viewer Cookies vor dem Senden einer Anfrage verschlüsselt. Wir empfehlen, den `Set-Cookie` Header über eine HTTPS-Verbindung zu senden, um sicherzustellen, dass die Cookie-Attribute vor man-in-the-middle Angriffen geschützt sind.  
**`HttpOnly`**  
Macht es erforderlich, dass der Viewer das Cookie nur in HTTP- oder HTTPS-Anfragen sendet.  
**`CloudFront-Policy`**  
Ihre Richtlinienanweisung im JSON-Format, wobei Leerzeichen entfernt wurden und eine Base64-Codierung vorgenommen wurde. Weitere Informationen finden Sie unter [Erstellen einer Signatur für ein signiertes Cookie, das eine benutzerdefinierte Richtlinie verwendet](#private-content-custom-policy-signature-cookies).  
Die Richtlinienanweisung steuert den Zugriff, den ein signiertes Cookie einem Benutzer gewährt. Sie enthält die Dateien, auf die der Benutzer zugreifen kann, ein Ablaufdatum und eine Ablaufuhrzeit, ein optionales Datum und die Uhrzeit, zu der die URL gültig wird, und eine optionale IP-Adresse oder einen Bereich von IP-Adressen, die auf die Datei zugreifen dürfen.  
**`CloudFront-Signature`**  
Eine gehashte, signierte und Base64-codierte Version der JSON-Richtlinienanweisung. Weitere Informationen finden Sie unter [Erstellen einer Signatur für ein signiertes Cookie, das eine benutzerdefinierte Richtlinie verwendet](#private-content-custom-policy-signature-cookies).  
**`CloudFront-Key-Pair-Id`**  
Die ID für einen CloudFront öffentlichen Schlüssel, zum Beispiel`K2JCJMDEHXQW5F`. Die ID des öffentlichen Schlüssels gibt an CloudFront, welcher öffentliche Schlüssel zur Validierung der signierten URL verwendet werden soll. CloudFrontvergleicht die Informationen in der Signatur mit den Informationen in der Richtlinienerklärung, um sicherzustellen, dass die URL nicht manipuliert wurde.  
Dieser öffentliche Schlüssel muss zu einer Schlüsselgruppe gehören, die ein vertrauenswürdiger Aussteller in der Distribution ist. Weitere Informationen finden Sie unter [Geben Sie Unterzeichner an, die signierte URLs und signierte Cookies erstellen können](private-content-trusted-signers.md).

## `Set-Cookie`-Beispielheader für benutzerdefinierte Richtlinien
<a name="example-set-cookie-headers-custom-policy"></a>

Sehen Sie sich die folgenden Beispiele für `Set-Cookie`-Headerpaare an. 

Wenn Sie einen alternativen Domainnamen wie example.org in verwenden möchten URLs, müssen Sie den alternativen Domainnamen zu Ihrer Distribution hinzufügen, unabhängig davon, ob Sie das `Domain` Attribut angeben. Weitere Informationen finden Sie unter [Alternative Domainnamen (CNAMEs)](DownloadDistValuesGeneral.md#DownloadDistValuesCNAME) im Thema [Referenz für alle Distributionseinstellungen](distribution-web-values-specify.md).

**Example Beispiel 1**  
Sie können die `Set-Cookie` Header für ein signiertes Cookie verwenden, wenn Sie den Domainnamen verwenden, der Ihrer Distribution zugeordnet ist, in Ihren URLs Dateien.  

```
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
```

**Example Beispiel 2**  
Sie können die `Set-Cookie` Header für ein signiertes Cookie verwenden, wenn Sie URLs für Ihre Dateien einen alternativen Domainnamen (example.org) verwenden.  

```
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=example.org; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=example.org; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=example.org; Path=/; Secure; HttpOnly
```

**Example Beispiel 3**  
Sie können die `Set-Cookie` Header-Paare für eine signierte Anfrage verwenden, wenn Sie den Domainnamen verwenden, der Ihrer Distribution zugeordnet ist, in der URLs für Ihre Dateien.  

```
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=dd111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly
```

**Example Beispiel 4**  
Sie können die `Set-Cookie` Header-Paare für eine signierte Anfrage verwenden, wenn Sie einen alternativen Domainnamen (example.org) verwenden, der URLs Ihrer Distribution in Ihren Dateien zugeordnet ist.  

```
Set-Cookie: CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__; Domain=example.org; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_; Domain=example.org; Path=/; Secure; HttpOnly
Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=example.org; Path=/; Secure; HttpOnly
```

## Erstellen einer Richtlinienanweisung für ein signiertes Cookie, das eine benutzerdefinierte Richtlinie verwendet
<a name="private-content-custom-policy-statement-cookies"></a>

Zum Erstellen einer Richtlinienanweisung für eine benutzerdefinierte Richtlinie führen Sie die folgenden Schritte aus. Einige Beispiel-Richtlinienanweisungen, die den Zugriff auf Dateien auf verschiedene Weisen kontrollieren, finden Sie unter [Beispiel-Richtlinienanweisungen für ein signiertes Cookie, das eine benutzerdefinierte Richtlinie verwendet](#private-content-custom-policy-statement-signed-cookies-examples).<a name="private-content-custom-policy-statement-cookies-procedure"></a>

**So erstellen Sie die Richtlinienanweisung für ein signiertes Cookie, das eine benutzerdefinierte Richtlinie verwendet**

1. Erstellen Sie die Richtlinienanweisung unter Verwendung des folgenden JSON-Formats.

   ```
   {
       "Statement": [
           {
               "Resource": "URL of the file",
               "Condition": {
                   "DateLessThan": {
                       "AWS:EpochTime":required ending date and time in Unix time format and UTC
                   },
                   "DateGreaterThan": {
                       "AWS:EpochTime":optional beginning date and time in Unix time format and UTC
                   },
                   "IpAddress": {
                       "AWS:SourceIp": "optional IP address"
                   }
               }
           }
       ]
   }
   ```

   Beachten Sie Folgendes:
   + Sie können nur eine Anweisung einschließen.
   + Verwenden Sie UTF-8-Zeichencodierung.
   + Fügen Sie alle Satzzeichen und Parameternamen genau wie angegeben ein. Abkürzungen für Parameternamen werden nicht akzeptiert.
   + Die Reihenfolge der Parameter im Bereich `Condition` ist unerheblich.
   + Informationen zu den Werten für `Resource`, `DateLessThan`, `DateGreaterThan` und `IpAddress` finden Sie unter [Werte, die Sie in der Richtlinienanweisung für eine benutzerdefinierte Richtlinie für signierte Cookies angeben](#private-content-custom-policy-statement-cookies-values).

1. Entfernen Sie alle Leerzeichen (einschließlich Tabulatoren und Zeilenumbruchzeichen) aus der Richtlinienanweisung. Möglicherweise müssen Sie in der Zeichenfolge im Anwendungscode Escape-Zeichen einfügen.

1. Nehmen Sie eine Base64-Codierung der Richtlinienanweisung mithilfe von MIME-Base64-Codierung vor. Weitere Informationen finden Sie in [Abschnitt 6.8, Base64 Content-Transfer-Encoding](https://tools.ietf.org/html/rfc2045#section-6.8) in *RFC 2045, MIME (Multipurpose Internet Mail Extensions), Teil 1: Format von Internet-Nachrichtentexten*.

1. Ersetzen Sie Zeichen, die in einer URL-Abfragezeichenfolge nicht gültig sind, durch gültige Zeichen. In der folgenden Tabelle sind ungültige und gültige Zeichen aufgelistet.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/AmazonCloudFront/latest/DeveloperGuide/private-content-setting-signed-cookie-custom-policy.html)

1. Fügen Sie den resultierenden Wert im `Set-Cookie`-Header hinter `CloudFront-Policy=` ein.

1. Erstellen Sie eine Signatur für den `Set-Cookie`-Header für `CloudFront-Signature`, indem Sie die Richtlinienanweisung hashen, signieren und eine Base64-Codierung vornehmen. Weitere Informationen finden Sie unter [Erstellen einer Signatur für ein signiertes Cookie, das eine benutzerdefinierte Richtlinie verwendet](#private-content-custom-policy-signature-cookies).

### Werte, die Sie in der Richtlinienanweisung für eine benutzerdefinierte Richtlinie für signierte Cookies angeben
<a name="private-content-custom-policy-statement-cookies-values"></a>

Beim Erstellen einer Richtlinienanweisung für eine benutzerdefinierte Richtlinie geben Sie die folgenden Werte an.

**Ressource**  
Die Basis-URL einschließlich Ihrer Abfragezeichenfolgen, sofern vorhanden:  
`https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes`  
Wenn Sie den `Resource`-Parameter weglassen, können Benutzer auf alle Dateien zugreifen, die mit einer Distribution verknüpft sind, die mit dem zum Erstellen der signierten URL verwendeten Schlüsselpaar verknüpft ist.
Sie können nur einen Wert für `Resource` angeben.  
Beachten Sie Folgendes:  
+ **Protokoll** – Der Wert muss mit `http://` oder `https://` beginnen.
+ **Abfragezeichenfolgeparameter** – Wenn Sie über keine Abfragezeichenfolgeparameter verfügen, lassen Sie das Fragezeichen weg.
+ **Platzhalter** – Sie können das Platzhalterzeichen, das null oder mehr Zeichen (\$1), oder das Platzhalterzeichen, das genau einem Zeichen (?) irgendwo in der Zeichenfolge entspricht, verwenden. Beispielsweise würde der Wert:

  `https://d111111abcdef8.cloudfront.net/*game_download.zip*`

  u. a. die folgenden Dateien umfassen:
  + `https://d111111abcdef8.cloudfront.net/game_download.zip`
  + `https://d111111abcdef8.cloudfront.net/example_game_download.zip?license=yes`
  + `https://d111111abcdef8.cloudfront.net/test_game_download.zip?license=temp`
+ **Alternative Domänennamen** – Wenn Sie einen alternativen Domänennamen (CNAME) in der URL angeben, müssen Sie diesen alternativen Domänennamen angeben, wenn Sie auf Ihrer Webseite oder in Ihrer Anwendung auf die Datei verweisen. Geben Sie nicht die Amazon S3-URL für Datei an.

**DateLessThan**  
Das Ablaufdatum und die Ablaufzeit für die URL im Unix-Zeitformat (in Sekunden) und in koordinierter Weltzeit (UTC). Setzen Sie den Wert nicht in Anführungszeichen.  
Beispielsweise wird der 16. März 2015, 10:00 Uhr UTC in 1426500000 im Unix-Zeitformat umgewandelt.  
Weitere Informationen finden Sie unter [When CloudFront überprüft das Ablaufdatum und die Uhrzeit in einem signierten Cookie](private-content-signed-cookies.md#private-content-check-expiration-cookie).

**DateGreaterThan (Fakultativ)**  
Ein optionales Datum und eine optionale Zeit für die URL im Unix-Zeitformat (in Sekunden) und in koordinierter Weltzeit (UTC). Benutzer sind an oder vor dem angegebenen Datum und der angegebenen Zeit nicht berechtigt, auf die Datei zuzugreifen. Setzen Sie den Wert nicht in Anführungszeichen. 

**IpAddress (Fakultativ)**  
Die IP-Adresse des Clients, der die GET-Anfrage stellt. Beachten Sie Folgendes:  
+ Um allen IP-Adressen den Zugriff auf die Datei zu gewähren, lassen Sie den Parameter `IpAddress` weg.
+ Sie können entweder eine IP-Adresse oder einen IP-Adressbereich angeben. Sie können die Richtlinie beispielsweise nicht so einrichten, dass Zugriff gewährt wird, wenn die IP-Adresse des Clients sich in einem von zwei getrennten Bereichen befindet.
+ Um den Zugriff von einer einzigen IP-Adresse zu gewähren, geben Sie Folgendes an:

  `"`*IPv4 IP address*`/32"`
+ Sie müssen IP-Adressbereiche im IPv4 CIDR-Standardformat angeben (z. B.`192.0.2.0/24`). Weitere Informationen erhalten Sie unter *RFC 4632, Classless Inter-domain Routing (CIDR): The Internet Address Assignment and Aggregation Plan*, [https://tools.ietf.org/html/rfc4632](https://tools.ietf.org/html/rfc4632).
**Wichtig**  
IP-Adressen im IPv6 Format 2001:0 db 8:85 a3: :8a2e: 0370:7334 werden nicht unterstützt. 

  Wenn Sie eine benutzerdefinierte Richtlinie verwenden, die Folgendes umfasst: Aktivieren Sie diese Option nicht für die Verteilung. `IpAddress` IPv6 Wenn Sie den Zugriff auf einige Inhalte anhand der IP-Adresse und IPv6 Supportanfragen für andere Inhalte einschränken möchten, können Sie zwei Distributionen erstellen. Weitere Informationen finden Sie unter [Aktivieren IPv6 (Zuschaueranfragen)](DownloadDistValuesGeneral.md#DownloadDistValuesEnableIPv6) im Thema [Referenz für alle Distributionseinstellungen](distribution-web-values-specify.md).

## Beispiel-Richtlinienanweisungen für ein signiertes Cookie, das eine benutzerdefinierte Richtlinie verwendet
<a name="private-content-custom-policy-statement-signed-cookies-examples"></a>

Die folgenden Beispiel-Richtlinienanweisungen zeigen, wie der Zugriff auf eine bestimmte Datei, auf alle Dateien in einem Verzeichnis oder auf alle mit einer Schlüsselpaar-ID verknüpften Dateien kontrolliert wird. Die Beispiele zeigen auch, wie der Zugriff von einer einzelnen IP-Adresse oder einem Bereich von IP-Adressen kontrolliert wird und wie Sie verhindern, dass Benutzer das signierte Cookie nach einem festgelegten Datum und einer festgelegten Zeit verwenden.

Wenn Sie eines dieser Beispiele kopieren und einfügen, entfernen Sie alle Leerzeichen (einschließlich Tabuloren und Zeilenumbruchzeichen), ersetzen Sie die entsprechenden Werte durch Ihre eigenen Werte und fügen Sie ein Zeilenumbruchzeichen hinter der schließenden Klammer ( \$1 ) ein.

Weitere Informationen finden Sie unter [Werte, die Sie in der Richtlinienanweisung für eine benutzerdefinierte Richtlinie für signierte Cookies angeben](#private-content-custom-policy-statement-cookies-values).

**Topics**
+ [Beispiel-Richtlinienanweisung: Zugriff auf eine Datei von einem Bereich von IP-Adressen aus](#private-content-custom-policy-statement-signed-cookies-example-one-object)
+ [Beispiel-Richtlinienanweisung: Zugriff auf alle Dateien in einem Verzeichnis über einen Bereich von IP-Adressen](#private-content-custom-policy-statement-signed-cookies-example-all-objects)
+ [Beispiel-Richtlinienanweisung: Zugriff auf alle mit einer Schlüsselpaar-ID verknüpften Dateien über eine IP-Adresse](#private-content-custom-policy-statement-signed-cookies-example-one-ip)

### Beispiel-Richtlinienanweisung: Zugriff auf eine Datei von einem Bereich von IP-Adressen aus
<a name="private-content-custom-policy-statement-signed-cookies-example-one-object"></a>

Die folgende Beispiel-Richtlinienanweisung in einem signierten Cookie legt fest, dass ein Benutzer bis zum 1. Januar 2023, 10:00 Uhr UTC, von IP-Adressen im Bereich `https://d111111abcdef8.cloudfront.net/game_download.zip` auf die Datei `192.0.2.0/24` zugreifen kann:

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

### Beispiel-Richtlinienanweisung: Zugriff auf alle Dateien in einem Verzeichnis über einen Bereich von IP-Adressen
<a name="private-content-custom-policy-statement-signed-cookies-example-all-objects"></a>

Mit der folgenden Beispiel-Richtlinienanweisung können Sie signierte Cookies für jede Datei im `training`-Verzeichnis erstellen wie durch das Platzhalterzeichen \$1 im `Resource`-Parameter verdeutlicht. Benutzer können bis zum 1. Januar 2013, 10:00 Uhr UTC, von IP-Adressen im Bereich `192.0.2.0/24` auf die Datei zugreifen:

```
{
    "Statement": [
        {
            "Resource": "https://d111111abcdef8.cloudfront.net/training/*",
            "Condition": {
                "IpAddress": {
                    "AWS:SourceIp": "192.0.2.0/24"
                },
                "DateLessThan": {
                    "AWS:EpochTime": 1767290400
                }
            }
        }
    ]
}
```

Jedes signierte Cookie, in dem Sie diese Richtlinie verwenden, enthält eine Basis-URL, die eine bestimmte Datei kennzeichnet, zum Beispiel:

`https://d111111abcdef8.cloudfront.net/training/orientation.pdf`

### Beispiel-Richtlinienanweisung: Zugriff auf alle mit einer Schlüsselpaar-ID verknüpften Dateien über eine IP-Adresse
<a name="private-content-custom-policy-statement-signed-cookies-example-one-ip"></a>

Mit der folgenden Beispiel-Richtlinienanweisung können Sie signierte Cookies für jede mit einer beliebigen Distribution verknüpfte Datei einrichten wie durch das Platzhalterzeichen \$1 im `Resource`-Parameter verdeutlicht. Der Benutzer muss die IP-Adresse verwende `192.0.2.10/32`. (Der Wert `192.0.2.10/32` in CIDR-Notation bezieht sich auf eine einzelne IP-Adresse, `192.0.2.10`.) Die Dateien sind nur vom 1. Januar 2013, 10:00 Uhr UTC, bis zum 2. Januar 2013, 10:00 Uhr UTC, verfügbar:

```
{
    "Statement": [
        {
            "Resource": "https://*",
            "Condition": {
                "IpAddress": {
                    "AWS:SourceIp": "192.0.2.10/32"
                },
                "DateGreaterThan": {
                    "AWS:EpochTime": 1767290400
                },
                "DateLessThan": {
                    "AWS:EpochTime": 1767376800
                }
            }
        }
    ]
}
```

Jedes signierte Cookie, in dem Sie diese Richtlinie verwenden, enthält eine Basis-URL, die eine bestimmte Datei in einer bestimmten CloudFront Distribution identifiziert, zum Beispiel:

`https://d111111abcdef8.cloudfront.net/training/orientation.pdf`

Das signierte Cookie enthält auch eine Schlüsselpaar-ID, die mit einem vertrauenswürdigen Aussteller in der Distribution (d111111abcdef8.cloudfront.net) verknüpft werden muss, die Sie in der Basis-URL angeben.

## Erstellen einer Signatur für ein signiertes Cookie, das eine benutzerdefinierte Richtlinie verwendet
<a name="private-content-custom-policy-signature-cookies"></a>

Bei der Signatur für ein signiertes Cookie, das eine benutzerdefinierte Richtlinie verwendet, handelt es sich um eine gehashte, signierte und Base64-codierte Version der Richtlinienanweisung. 

Weitere Informationen und Beispiele für das Hashing, Signieren und Codieren der Richtlinienanweisung finden Sie unter:
+ [Linux-Befehle und OpenSSL für die Base64-Codierung und die Verschlüsselung](private-content-linux-openssl.md)
+ [Code-Beispiele für das Erstellen einer Signatur für eine signierte URL](PrivateCFSignatureCodeAndExamples.md)<a name="private-content-custom-policy-signature-cookies-procedure"></a>

**So erstellen Sie eine Signatur für ein signiertes Cookie mithilfe einer benutzerdefinierten Richtlinie**

1. Verwenden Sie die SHA-1-Hash-Funktion und RSA, um die im Verfahren [So erstellen Sie die Richtlinienanweisung für eine signierte URL, die eine benutzerdefinierte Richtlinie verwendet](private-content-creating-signed-url-custom-policy.md#private-content-custom-policy-creating-policy-procedure) erstellte JSON-Richtlinienanweisung zu hashen und zu signieren. Verwenden Sie die Version der Richtlinienanweisung, die keine Leerzeichen mehr enthält, jedoch noch nicht Base64-codiert wurde.

   Verwenden Sie für den privaten Schlüssel, der für die Hash-Funktion erforderlich ist, einen privaten Schlüssel, dessen öffentlicher Schlüssel sich in einer aktiven vertrauenswürdigen Schlüsselgruppe für die Distribution befindet.
**Anmerkung**  
Die Methode, die Sie zum Hashen und Signieren der Richtlinienanweisung verwenden, ist abhängig von Ihrer Programmiersprache und Plattform. Einen Beispiel-Code finden Sie unter [Code-Beispiele für das Erstellen einer Signatur für eine signierte URL](PrivateCFSignatureCodeAndExamples.md).

1. Entfernen Sie die Leerzeichen (einschließlich Tabulatoren und Zeilenumbruchzeichen) aus der gehashten und signierten Zeichenfolge.

1. Nehmen Sie eine Base64-Codierung der Zeichenfolge mithilfe von MIME-Base64-Codierung vor. Weitere Informationen finden Sie in [Abschnitt 6.8, Base64, Content-Transfer-Encoding](https://tools.ietf.org/html/rfc2045#section-6.8) in *RFC 2045, MIME (Multipurpose Internet Mail Extensions), Teil 1: Format von Internet-Nachrichtentexten*.

1. Ersetzen Sie Zeichen, die in einer URL-Abfragezeichenfolge nicht gültig sind, durch gültige Zeichen. In der folgenden Tabelle sind ungültige und gültige Zeichen aufgelistet.  
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/de_de/AmazonCloudFront/latest/DeveloperGuide/private-content-setting-signed-cookie-custom-policy.html)

1. Fügen Sie den resultierenden Wert im `Set-Cookie`-Header für das `CloudFront-Signature=`-Name-Wert-Paar ein und kehren Sie zu [So richten Sie ein signiertes Cookies mit einer benutzerdefinierten Richtlinie ein](#private-content-setting-signed-cookie-custom-policy-procedure) zurück, um den `Set-Cookie`-Header für `CloudFront-Key-Pair-Id` hinzuzufügen.

# Erstellen signierter Cookies mit PHP
<a name="signed-cookies-PHP"></a>

Das folgende Codebeispiel ähnelt dem Beispiel aus [Erstellen einer URL-Signatur mit PHP](CreateURL_PHP.md) insofern, als es einen Link zu einem Video erstellt. Anstatt jedoch die URL im Code zu signieren, signiert dieses Beispiel die Cookies mit der Funktion `create_signed_cookies()`. Der clientseitige Player verwendet die Cookies, um jede Anfrage an die Distribution zu authentifizieren. CloudFront

Dieser Ansatz ist nützlich, um Inhalte wie HTTP Live Streaming (HLS) oder Dynamic Adaptive Streaming over HTTP (DASH) zu streamen, bei denen der Client mehrere Anforderungen stellen muss, um das Manifest, die Segmente und die zugehörigen Wiedergabe-Assets abzurufen. Mithilfe signierter Cookies kann der Client jede Anforderung authentifizieren, ohne für jedes Segment eine neue signierte URL generieren zu müssen. 

**Anmerkung**  
Das Erstellen einer URL-Signatur ist nur ein Teil der Bereitstellung privater Inhalte über signierte Cookies. Weitere Informationen finden Sie unter [Verwenden signierter Cookies](private-content-signed-cookies.md).



**Topics**
+ [Erstellen der RSA-SHA-1-Signatur](#create-rsa-sha-1signature-cookies)
+ [Erstellen der signierten Cookies](#create-the-signed-cookie)
+ [Vollständiger Code](#full-code-signed-cookies)

In den folgenden Abschnitten wird das Codebeispiel in einzelne Teile unterteilt. Das vollständige [Codebeispiel](#full-code-signed-cookies) finden Sie unten.

## Erstellen der RSA-SHA-1-Signatur
<a name="create-rsa-sha-1signature-cookies"></a>

Dieses Codebeispiel führt Folgendes aus:

1. Die Funktion `rsa_sha1_sign` hasht und signiert die Richtlinienanweisung. Die erforderlichen Argumente sind eine Richtlinienanweisung und der private Schlüssel, der einem öffentlichen Schlüssel entspricht, der sich in einer vertrauenswürdigen Schlüsselgruppe für Ihre Distribution befindet.

1. Als Nächstes erstellt die Funktion `url_safe_base64_encode` eine URL-sichere Version der Signatur.

   ```
   function rsa_sha1_sign($policy, $private_key_filename) {
       $signature = "";
       $fp = fopen($private_key_filename, "r");
       $priv_key = fread($fp, 8192);
       fclose($fp);
       $pkeyid = openssl_get_privatekey($priv_key);
       openssl_sign($policy, $signature, $pkeyid);
       openssl_free_key($pkeyid);
       return $signature;
   }
   
   function url_safe_base64_encode($value) {
       $encoded = base64_encode($value);
       return str_replace(
           array('+', '=', '/'),
           array('-', '_', '~'),
           $encoded);
   }
   ```

## Erstellen der signierten Cookies
<a name="create-the-signed-cookie"></a>

Der folgende Code konstruiert und erstellt die signierten Cookies unter Verwendung der folgenden Cookie-Attribute: `CloudFront-Expires`, `CloudFront-Signature` und `CloudFront-Key-Pair-Id`. Der Code verwendet eine benutzerdefinierte Richtlinie.

```
function create_signed_cookies($resource, $private_key_filename, $key_pair_id, $expires, $client_ip = null) {
    $policy = array(
        'Statement' => array(
            array(
                'Resource' => $resource,
                'Condition' => array(
                    'DateLessThan' => array('AWS:EpochTime' => $expires)
                )
            )
        )
    );

    if ($client_ip) {
        $policy['Statement'][0]['Condition']['IpAddress'] = array('AWS:SourceIp' => $client_ip . '/32');
    }

    $policy = json_encode($policy);
    $encoded_policy = url_safe_base64_encode($policy);
    $signature = rsa_sha1_sign($policy, $private_key_filename);
    $encoded_signature = url_safe_base64_encode($signature);

    return array(
        'CloudFront-Policy' => $encoded_policy,
        'CloudFront-Signature' => $encoded_signature,
        'CloudFront-Key-Pair-Id' => $key_pair_id
    );
}
```

Weitere Informationen finden Sie unter [Einrichten signierter Cookies mit einer benutzerdefinierten Richtlinie](private-content-setting-signed-cookie-custom-policy.md).

## Vollständiger Code
<a name="full-code-signed-cookies"></a>

Der folgende Beispielcode bietet eine vollständige Demonstration der Erstellung CloudFront signierter Cookies mit PHP. Sie können das vollständige Beispiel aus der Datei [demo-php.zip](samples/demo-php.zip) herunterladen.

Im folgenden Beispiel können Sie das `$policy Condition` Element so ändern, dass IPv4 sowohl IPv6 Adressbereiche als auch Adressbereiche zulässig sind. Ein Beispiel finden Sie unter [ IPv6 Adressen in IAM-Richtlinien verwenden](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ipv6-access.html#ipv6-access-iam) im *Amazon Simple Storage Service-Benutzerhandbuch*.

```
<?php

function rsa_sha1_sign($policy, $private_key_filename) {
    $signature = "";
    $fp = fopen($private_key_filename, "r");
    $priv_key = fread($fp, 8192);
    fclose($fp);
    $pkeyid = openssl_get_privatekey($priv_key);
    openssl_sign($policy, $signature, $pkeyid);
    openssl_free_key($pkeyid);
    return $signature;
}

function url_safe_base64_encode($value) {
    $encoded = base64_encode($value);
    return str_replace(
        array('+', '=', '/'),
        array('-', '_', '~'),
        $encoded);
}

function create_signed_cookies($resource, $private_key_filename, $key_pair_id, $expires, $client_ip = null) {
    $policy = array(
        'Statement' => array(
            array(
                'Resource' => $resource,
                'Condition' => array(
                    'DateLessThan' => array('AWS:EpochTime' => $expires)
                )
            )
        )
    );

    if ($client_ip) {
        $policy['Statement'][0]['Condition']['IpAddress'] = array('AWS:SourceIp' => $client_ip . '/32');
    }

    $policy = json_encode($policy);
    $encoded_policy = url_safe_base64_encode($policy);
    $signature = rsa_sha1_sign($policy, $private_key_filename);
    $encoded_signature = url_safe_base64_encode($signature);

    return array(
        'CloudFront-Policy' => $encoded_policy,
        'CloudFront-Signature' => $encoded_signature,
        'CloudFront-Key-Pair-Id' => $key_pair_id
    );
}



$private_key_filename = '/home/test/secure/example-priv-key.pem';
$key_pair_id = 'K2JCJMDEHXQW5F';
$base_url = 'https://d1234.cloudfront.net';

$expires = time() + 3600; // 1 hour from now

// Get the viewer real IP from the x-forward-for header as $_SERVER['REMOTE_ADDR'] will return viewer facing IP. An alternative option is to use CloudFront-Viewer-Address header. Note that this header is a trusted CloudFront immutable header. Example format: IP:PORT ("CloudFront-Viewer-Address": "1.2.3.4:12345")
$client_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];


// For HLS manifest and segments (using wildcard)
$hls_resource = $base_url . '/sign/*';
$signed_cookies = create_signed_cookies($hls_resource, $private_key_filename, $key_pair_id, $expires, $client_ip);

// Set the cookies
$cookie_domain = parse_url($base_url, PHP_URL_HOST);
foreach ($signed_cookies as $name => $value) {
    setcookie($name, $value, $expires, '/', $cookie_domain, true, true);
}

?>

<!DOCTYPE html>
<html>
<head>
    <title>CloudFront Signed HLS Stream with Cookies</title>
</head>
<body>
    <h1>Amazon CloudFront Signed HLS Stream with Cookies</h1>
    <h2>Expires at <?php echo gmdate('Y-m-d H:i:s T', $expires); ?> only viewable by IP <?php echo $client_ip; ?></h2>
    
    <div id='hls-video'>
        <video id="video" width="640" height="360" controls></video>
    </div>

    <script src="https://cdn.jsdelivr.net/npm/hls.js@latest"></script>
    <script>
        var video = document.getElementById('video');
        var manifestUrl = '<?php echo $base_url; ?>/sign/manifest.m3u8';
        
        if (Hls.isSupported()) {
            var hls = new Hls();
            hls.loadSource(manifestUrl);
            hls.attachMedia(video);
        }
        else if (video.canPlayType('application/vnd.apple.mpegurl')) {
            video.src = manifestUrl;
        }
    </script>
</body>
</html>
```

Anstatt signierte Cookies zu verwenden, können Sie signierte URLs Cookies verwenden. Weitere Informationen finden Sie unter [Erstellen einer URL-Signatur mit PHP](CreateURL_PHP.md).

# Linux-Befehle und OpenSSL für die Base64-Codierung und die Verschlüsselung
<a name="private-content-linux-openssl"></a>

Sie können den folgenden Linux-Befehlszeilenbefehl und OpenSSL verwenden, um die Richtlinienanweisung zu hashen und zu signieren, die Signatur in Base64 zu codieren und Zeichen, die in URL-Abfragezeichenfolgeparametern nicht gültig sind, durch gültige zu ersetzen.

Informationen zu OpenSSL finden Sie unter [https://www.openssl.org](https://www.openssl.org).

```
cat policy | tr -d "\n" | tr -d " \t\n\r" | openssl sha1 -sign private_key.pem | openssl base64 -A | tr -- '+=/' '-_~'
```

Beim vorhergehenden Befehl:
+ `cat``policy`liest die Datei.
+ `tr -d "\n" | tr -d " \t\n\r"` entfernt die Leerzeichen und Zeilenumbruchzeichen, die von `cat` hinzugefügt wurden.
+ OpenSSL führt unter Verwendung von SHA-1 ein Hashing der Datei durch und signiert sie mithilfe der privaten Schlüsseldatei `private_key.pem`. Die Signatur des privaten Schlüssels kann entweder RSA 2048 oder ECDSA 256 sein.
+ OpenSSL codiert die gehashte und signierte Richtlinienanweisung in Base64.
+ `tr`ersetzt Zeichen, die in URL-Abfragezeichenfolgenparametern nicht gültig sind, durch gültige Zeichen.

Weitere Code-Beispiele, welche die Erstellung einer Signatur veranschaulichen, finden Sie unter [Code-Beispiele für das Erstellen einer Signatur für eine signierte URL](PrivateCFSignatureCodeAndExamples.md).

# Code-Beispiele für das Erstellen einer Signatur für eine signierte URL
<a name="PrivateCFSignatureCodeAndExamples"></a>

Dieser Abschnitt enthält Anwendungsbeispiele zum Herunterladen, die zeigen, wie Signaturen für signierte Dateien erstellt URLs werden. Beispiele sind in Perl, PHP, C\$1 und Java verfügbar. Sie können jedes der Beispiele verwenden, um signierte zu erstellen URLs. Das Perl-Skript wird auf Linux-/macOS-Plattformen ausgeführt. Das PHP-Beispiel funktioniert auf allen Servern, auf denen PHP ausgeführt wird. Das C\$1-Beispiel verwendet das .NET Framework.

Beispielcode in JavaScript (Node.js) finden Sie unter [Creating Amazon CloudFront Signed URLs in Node.js im](https://aws.amazon.com/blogs/developer/creating-amazon-cloudfront-signed-urls-in-node-js/) AWS Developer Blog.

Beispielcode in Python finden Sie unter [Generate a signed URL for Amazon CloudFront](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/cloudfront.html#examples) in der *AWS SDK for Python (Boto3) API-Referenz* und [diesen Beispielcode](https://github.com/boto/boto3/blob/develop/boto3/examples/cloudfront.rst) im GitHub Boto3-Repository.

**Topics**
+ [Erstellen einer URL-Signatur mit Perl](CreateURLPerl.md)
+ [Erstellen einer URL-Signatur mit PHP](CreateURL_PHP.md)
+ [Erstellen einer URL-Signatur mithilfe von C\$1 und dem .NET Framework](CreateSignatureInCSharp.md)
+ [Erstellen einer URL-Signatur mit Java](CFPrivateDistJavaDevelopment.md)

# Erstellen einer URL-Signatur mit Perl
<a name="CreateURLPerl"></a>

Dieser Abschnitt enthält ein Perl-Skript für Linux/Mac Plattformen, mit dem Sie die Signatur für private Inhalte erstellen können. Um die Signatur zu erstellen, führen Sie das Skript mit Befehlszeilenargumenten aus, die die CloudFront URL, den Pfad zum privaten Schlüssel des Unterzeichners, die Schlüssel-ID und ein Ablaufdatum für die URL angeben. Das Tool kann auch signiert dekodieren. URLs 

**Anmerkung**  
Das Erstellen einer URL-Signatur ist nur ein Teil der Bereitstellung privater Inhalte über eine signierte URL. Weitere Informationen zu diesem end-to-end Prozess finden Sie unter[Verwenden Sie signierte URLs](private-content-signed-urls.md). 

**Topics**
+ [Quelle für das Perl-Skript zum Erstellen einer signierten URL](#CreateURLPerlScriptSource)

## Quelle für das Perl-Skript zum Erstellen einer signierten URL
<a name="CreateURLPerlScriptSource"></a>

Der folgende Perl-Quellcode kann verwendet werden, um eine signierte URL für CloudFront zu erstellen. Kommentare im Code beinhalten Informationen zu den Befehlszeilen-Switches und den Features des Tools.

```
#!/usr/bin/perl -w

# Copyright 2008 Amazon Technologies, Inc.  Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License. You may obtain a copy of the License at:
#
# https://aws.amazon.com/apache2.0
#
# This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and limitations under the License.

=head1 cfsign.pl

cfsign.pl - A tool to generate and verify Amazon CloudFront signed URLs

=head1 SYNOPSIS

This script uses an existing RSA key pair to sign and verify Amazon CloudFront signed URLs

View the script source for details as to which CPAN packages are required beforehand. 

For help, try:

cfsign.pl --help

URL signing examples:

cfsign.pl --action encode --url https://images.my-website.com/gallery1.zip --policy sample_policy.json --private-key privkey.pem --key-pair-id mykey

cfsign.pl --action encode --url https://images.my-website.com/gallery1.zip --expires 1257439868 --private-key privkey.pem --key-pair-id mykey

URL decode example:

cfsign.pl --action decode --url "http//mydist.cloudfront.net/?Signature=AGO-PgxkYo99MkJFHvjfGXjG1QDEXeaDb4Qtzmy85wqyJjK7eKojQWa4BCRcow__&Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovLypicmFkbS5qcGciLCJDb25kaXRpb24iOnsiSXBBZGRyZXNzIjp7IkFXUzpTb3VyY2VJcCI6IjEwLjUyLjE3LjkvMCJ9LCJEYXRlR3JlYXRlclRoYW4iOnsiQVdTOkVwb2NoVGltZSI6MTI1MjUyMDgzMH19fV19Cg__&Key-Pair-Id=mykey"


To generate an RSA key pair, you can use openssl and the following commands:

# Generate a 2048 bit key pair
openssl genrsa -out private-key.pem 2048
openssl rsa -in private-key.pem -pubout -out public-key.pem


=head1 OPTIONS

=over 8

=item B<--help>

Print a help message and exits.

=item B<--action> [action]

The action to execute.  action can be one of:

  encode - Generate a signed URL (using a canned policy or a user policy)
  decode - Decode a signed URL

=item B<--url>

The URL to en/decode

=item B<--stream>

The stream to en/decode

=item B<--private-key>

The path to your private key.

=item B<--key-pair-id>

The key pair identifier.

=item B<--policy>

The CloudFront policy document.

=item B<--expires>

The Unix epoch time when the URL is to expire. If both this option and
the --policy option are specified, --policy will be used. Otherwise, this 
option alone will use a canned policy.

=back

=cut

use strict;
use warnings;

# you might need to use CPAN to get these modules.
# run perl -MCPAN -e "install <module>" to get them.
# The openssl command line will also need to be in your $PATH.
use File::Temp qw/tempfile/;
use File::Slurp;
use Getopt::Long;
use IPC::Open2;
use MIME::Base64 qw(encode_base64 decode_base64);
use Pod::Usage;
use URI;

my $CANNED_POLICY 
    = '{"Statement":[{"Resource":"<RESOURCE>","Condition":{"DateLessThan":{"AWS:EpochTime":<EXPIRES>}}}]}';

my $POLICY_PARAM      = "Policy";
my $EXPIRES_PARAM     = "Expires";
my $SIGNATURE_PARAM   = "Signature";
my $KEY_PAIR_ID_PARAM = "Key-Pair-Id";

my $verbose = 0;
my $policy_filename = "";
my $expires_epoch = 0;
my $action = "";
my $help = 0;
my $key_pair_id = "";
my $url = "";
my $stream = "";
my $private_key_filename = "";

my $result = GetOptions("action=s"      => \$action,
                        "policy=s"      => \$policy_filename,
                        "expires=i"     => \$expires_epoch,
                        "private-key=s" => \$private_key_filename,
                        "key-pair-id=s" => \$key_pair_id,
                        "verbose"       => \$verbose,
                        "help"          => \$help,
                        "url=s"         => \$url,
                        "stream=s"      => \$stream,
                    );

if ($help or !$result) {
    pod2usage(1);
    exit;
}

if ($url eq "" and $stream eq "") {
    print STDERR "Must include a stream or a URL to encode or decode with the --stream or --url option\n";
    exit;
}

if ($url ne "" and $stream ne "") {
    print STDERR "Only one of --url and --stream may be specified\n";
    exit;
}

if ($url ne "" and !is_url_valid($url)) {
    exit;
}

if ($stream ne "") {
    exit unless is_stream_valid($stream);

    # The signing mechanism is identical, so from here on just pretend we're
    # dealing with a URL
    $url = $stream;
} 

if ($action eq "encode") {
    # The encode action will generate a private content URL given a base URL, 
    # a policy file (or an expires timestamp) and a key pair id parameter
    my $private_key;
    my $public_key;
    my $public_key_file;
    
    my $policy;
    if ($policy_filename eq "") {
        if ($expires_epoch == 0) {
            print STDERR "Must include policy filename with --policy argument or an expires" . 
                          "time using --expires\n";            
        }
        
        $policy = $CANNED_POLICY;
        $policy =~ s/<EXPIRES>/$expires_epoch/g;
        $policy =~ s/<RESOURCE>/$url/g;
    } else {
        if (! -e $policy_filename) {
            print STDERR "Policy file $policy_filename does not exist\n";
            exit;
        }
        $expires_epoch = 0; # ignore if set
        $policy = read_file($policy_filename);
    }

    if ($private_key_filename eq "") {
        print STDERR "You must specific the path to your private key file with --private-key\n";
        exit;
    }

    if (! -e $private_key_filename) {
        print STDERR "Private key file $private_key_filename does not exist\n";
        exit;
    }

    if ($key_pair_id eq "") {
        print STDERR "You must specify a key pair id with --key-pair-id\n";
        exit;
    }

    my $encoded_policy = url_safe_base64_encode($policy);
    my $signature = rsa_sha1_sign($policy, $private_key_filename);
    my $encoded_signature = url_safe_base64_encode($signature);

    my $generated_url = create_url($url, $encoded_policy, $encoded_signature, $key_pair_id, $expires_epoch);


    if ($stream ne "") {
        print "Encoded stream (for use within a swf):\n" . $generated_url . "\n";
        print "Encoded and escaped stream (for use on a webpage):\n" .  escape_url_for_webpage($generated_url) . "\n"; 
    } else {
        print "Encoded URL:\n" . $generated_url . "\n";
    }
} elsif ($action eq "decode") {
    my $decoded = decode_url($url);
    if (!$decoded) {
        print STDERR "Improperly formed URL\n";
        exit;
    }

    print_decoded_url($decoded);
} else {
    # No action specified, print help.  But only if this is run as a program (caller will be empty)
    pod2usage(1) unless caller();
}

# Decode a private content URL into its component parts
sub decode_url {
    my $url = shift;

    if ($url =~ /(.*)\?(.*)/) {
        my $base_url = $1;
        my $params = $2;

        my @unparsed_params = split(/&/, $params);
        my %params = ();
        foreach my $param (@unparsed_params) {
            my ($key, $val) = split(/=/, $param);
            $params{$key} = $val;
        }

        my $encoded_signature = "";
        if (exists $params{$SIGNATURE_PARAM}) {
            $encoded_signature = $params{"Signature"};
        } else {
            print STDERR "Missing Signature URL parameter\n";
            return 0;
        }

        my $encoded_policy = "";
        if (exists $params{$POLICY_PARAM}) {
            $encoded_policy = $params{$POLICY_PARAM};
        } else {
            if (!exists $params{$EXPIRES_PARAM}) {
                print STDERR "Either the Policy or Expires URL parameter needs to be specified\n";
                return 0;    
            }
            
            my $expires = $params{$EXPIRES_PARAM};
            
            my $policy = $CANNED_POLICY;
            $policy =~ s/<EXPIRES>/$expires/g;
            
            my $url_without_cf_params = $url;
            $url_without_cf_params =~ s/$SIGNATURE_PARAM=[^&]*&?//g;
            $url_without_cf_params =~ s/$POLICY_PARAM=[^&]*&?//g;
            $url_without_cf_params =~ s/$EXPIRES_PARAM=[^&]*&?//g;
            $url_without_cf_params =~ s/$KEY_PAIR_ID_PARAM=[^&]*&?//g;
            
            if ($url_without_cf_params =~ /(.*)\?$/) {
                $url_without_cf_params = $1;
            }
            
            $policy =~ s/<RESOURCE>/$url_without_cf_params/g;
            
            $encoded_policy = url_safe_base64_encode($policy);
        }

        my $key = "";
        if (exists $params{$KEY_PAIR_ID_PARAM}) {
            $key = $params{$KEY_PAIR_ID_PARAM};
        } else {
            print STDERR "Missing $KEY_PAIR_ID_PARAM parameter\n";
            return 0;
        }

        my $policy = url_safe_base64_decode($encoded_policy);

        my %ret = ();
        $ret{"base_url"} = $base_url;
        $ret{"policy"} = $policy;
        $ret{"key"} = $key;

        return \%ret;
    } else {
        return 0;
    }
}

# Print a decoded URL out
sub print_decoded_url {
    my $decoded = shift;

    print "Base URL: \n" . $decoded->{"base_url"} . "\n";
    print "Policy: \n" . $decoded->{"policy"} . "\n";
    print "Key: \n" . $decoded->{"key"} . "\n";
}

# Encode a string with base 64 encoding and replace some invalid URL characters
sub url_safe_base64_encode {
    my ($value) = @_;

    my $result = encode_base64($value);
    $result =~ tr|+=/|-_~|;

    return $result;
}

# Decode a string with base 64 encoding.  URL-decode the string first
# followed by reversing any special character ("+=/") translation.
sub url_safe_base64_decode {
    my ($value) = @_;

    $value =~ s/%([0-9A-Fa-f]{2})/chr(hex($1))/eg;
    $value =~ tr|-_~|+=/|;

    my $result = decode_base64($value);

    return $result;
}

# Create a private content URL
sub create_url {
    my ($path, $policy, $signature, $key_pair_id, $expires) = @_;
    
    my $result;
    my $separator = $path =~ /\?/ ? '&' : '?';
    if ($expires) {
        $result = "$path$separator$EXPIRES_PARAM=$expires&$SIGNATURE_PARAM=$signature&$KEY_PAIR_ID_PARAM=$key_pair_id";
    } else {
        $result = "$path$separator$POLICY_PARAM=$policy&$SIGNATURE_PARAM=$signature&$KEY_PAIR_ID_PARAM=$key_pair_id";
    }
    $result =~ s/\n//g;

    return $result;
}

# Sign a document with given private key file.
# The first argument is the document to sign
# The second argument is the name of the private key file
sub rsa_sha1_sign {
    my ($to_sign, $pvkFile) = @_;
    print "openssl sha1 -sign $pvkFile $to_sign\n";

    return write_to_program($pvkFile, $to_sign);
}

# Helper function to write data to a program
sub write_to_program {
my ($keyfile, $data) = @_;
unlink "temp_policy.dat" if (-e "temp_policy.dat");
unlink "temp_sign.dat" if (-e "temp_sign.dat");

write_file("temp_policy.dat", $data);

system("openssl dgst -sha1 -sign \"$keyfile\" -out temp_sign.dat temp_policy.dat");

my $output = read_file("temp_sign.dat");

    return $output;
}

# Read a file into a string and return the string
sub read_file {
    my ($file) = @_;

    open(INFILE, "<$file") or die("Failed to open $file: $!");
    my $str = join('', <INFILE>);
    close INFILE;

    return $str;
}

sub is_url_valid {
    my ($url) = @_;

    # HTTP distributions start with http[s]:// and are the correct thing to sign
    if ($url =~ /^https?:\/\//) {
        return 1;
    } else {
        print STDERR "CloudFront requires absolute URLs for HTTP distributions\n";
        return 0;
    }
}

sub is_stream_valid {
    my ($stream) = @_;

    if ($stream =~ /^rtmp:\/\// or $stream =~ /^\/?cfx\/st/) {
        print STDERR "Streaming distributions require that only the stream name is signed.\n";
        print STDERR "The stream name is everything after, but not including, cfx/st/\n";
        return 0;
    } else {
        return 1;
    }
}

# flash requires that the query parameters in the stream name are url
# encoded when passed in through javascript, etc.  This sub handles the minimal
# required url encoding.
sub escape_url_for_webpage {
    my ($url) = @_;

    $url =~ s/\?/%3F/g;
    $url =~ s/=/%3D/g;
    $url =~ s/&/%26/g;

    return $url;
}

1;
```

# Erstellen einer URL-Signatur mit PHP
<a name="CreateURL_PHP"></a>

Jeder Webserver, auf dem PHP ausgeführt wird, kann diesen PHP-Beispielcode verwenden, um Richtlinienerklärungen und Signaturen für private CloudFront Distributionen zu erstellen. Das vollständige Beispiel erstellt eine funktionierende Webseite mit signierten URL-Links, die einen Videostream per CloudFront Streaming abspielen. Sie können das vollständige Beispiel aus der Datei [demo-php.zip](samples/demo-php.zip) herunterladen.

**Hinweise**  
Das Erstellen einer URL-Signatur ist nur ein Teil der Bereitstellung privater Inhalte über eine signierte URL. Weitere Informationen zum gesamten Prozess finden Sie unter [Verwenden Sie signierte URLs](private-content-signed-urls.md). 
Sie können auch signierte Dateien erstellen, URLs indem Sie die `UrlSigner` Klasse in der verwenden AWS SDK für PHP. Weitere Informationen finden Sie unter [Klasse UrlSigner](https://docs.aws.amazon.com/aws-sdk-php/v3/api/class-Aws.CloudFront.UrlSigner.html) in der *AWS SDK für PHP API-Referenz*.

**Topics**
+ [Erstellen der RSA-SHA-1-Signatur](#sample-rsa-sign)
+ [Erstellen einer vordefinierten Richtlinie](#sample-canned-policy)
+ [Erstellen einer benutzerdefinierten Richtlinie](#sample-custom-policy)
+ [Beispiel für vollständigen Code](#full-example)

In den folgenden Abschnitten wird das Codebeispiel in einzelne Teile unterteilt. Sie finden das [Beispiel für vollständigen Code](#full-example) unten.

## Erstellen der RSA-SHA-1-Signatur
<a name="sample-rsa-sign"></a>

Dieses Codebeispiel führt Folgendes aus:
+ Die Funktion `rsa_sha1_sign` hasht und signiert die Richtlinienanweisung. Die erforderlichen Argumente sind eine Richtlinienanweisung und der private Schlüssel, der einem öffentlichen Schlüssel entspricht, der sich in einer vertrauenswürdigen Schlüsselgruppe für Ihre Distribution befindet. 
+ Als Nächstes erstellt die Funktion `url_safe_base64_encode` eine URL-sichere Version der Signatur.

```
function rsa_sha1_sign($policy, $private_key_filename) {
    $signature = "";

    // load the private key
    $fp = fopen($private_key_filename, "r");
    $priv_key = fread($fp, 8192);
    fclose($fp);
    $pkeyid = openssl_get_privatekey($priv_key);

    // compute signature
    openssl_sign($policy, $signature, $pkeyid);

    // free the key from memory
    openssl_free_key($pkeyid);

    return $signature;
}

function url_safe_base64_encode($value) {
    $encoded = base64_encode($value);
    // replace unsafe characters +, = and / with 
    // the safe characters -, _ and ~
    return str_replace(
        array('+', '=', '/'),
        array('-', '_', '~'),
        $encoded);
}
```

Der folgende Codeausschnitt verwendet die Funktionen `get_canned_policy_stream_name()` und `get_custom_policy_stream_name()` erstellt eine vorgefertigte und benutzerdefinierte Richtlinie. CloudFront verwendet die Richtlinien, um die URL für das Streamen des Videos zu erstellen, einschließlich der Angabe der Ablaufzeit. 

Anschließend können Sie anhand einer vordefinierten Richtlinie oder einer benutzerdefinierten Richtlinie festlegen, wie der Zugriff auf Ihre Inhalte verwaltet werden soll. Weitere Informationen darüber, welche Sie wählen sollten, finden Sie im Abschnitt [Entscheiden Sie sich dafür, vordefinierte oder benutzerdefinierte Richtlinien für signierte Richtlinien zu verwenden URLs](private-content-signed-urls.md#private-content-choosing-canned-custom-policy).

## Erstellen einer vordefinierten Richtlinie
<a name="sample-canned-policy"></a>

Der folgende Beispielcode erstellt eine *vordefinierte* Richtlinienanweisung für die Signatur. 

**Anmerkung**  
Die `$expires` Variable ist ein date/time Stempel, der eine Ganzzahl und keine Zeichenfolge sein muss.

```
function get_canned_policy_stream_name($video_path, $private_key_filename, $key_pair_id, $expires) {
    // this policy is well known by CloudFront, but you still need to sign it, since it contains your parameters
    $canned_policy = '{"Statement":[{"Resource":"' . $video_path . '","Condition":{"DateLessThan":{"AWS:EpochTime":'. $expires . '}}}]}';
    // the policy contains characters that cannot be part of a URL, so we base64 encode it
    $encoded_policy = url_safe_base64_encode($canned_policy);
    // sign the original policy, not the encoded version
    $signature = rsa_sha1_sign($canned_policy, $private_key_filename);
    // make the signature safe to be included in a URL
    $encoded_signature = url_safe_base64_encode($signature);

    // combine the above into a stream name
    $stream_name = create_stream_name($video_path, null, $encoded_signature, $key_pair_id, $expires);
    // URL-encode the query string characters
    return $stream_name;
}
```

Weitere Informationen zu vordefinierten Richtlinien finden Sie unter [Erstellen einer signierten URL mit einer vordefinierten Richtlinie](private-content-creating-signed-url-canned-policy.md).

## Erstellen einer benutzerdefinierten Richtlinie
<a name="sample-custom-policy"></a>

Der folgende Beispielcode erstellt eine *benutzerdefinierte* Richtlinienanweisung für die Signatur. 

```
function get_custom_policy_stream_name($video_path, $private_key_filename, $key_pair_id, $policy) {
    // the policy contains characters that cannot be part of a URL, so we base64 encode it
    $encoded_policy = url_safe_base64_encode($policy);
    // sign the original policy, not the encoded version
    $signature = rsa_sha1_sign($policy, $private_key_filename);
    // make the signature safe to be included in a URL
    $encoded_signature = url_safe_base64_encode($signature);

    // combine the above into a stream name
    $stream_name = create_stream_name($video_path, $encoded_policy, $encoded_signature, $key_pair_id, null);
    // URL-encode the query string characters
    return $stream_name;
}
```

Weitere Informationen zu benutzerdefinierten Richtlinien finden Sie unter [Erstellen einer signierten URL mit einer benutzerdefinierten Richtlinie](private-content-creating-signed-url-custom-policy.md).

## Beispiel für vollständigen Code
<a name="full-example"></a>

Der folgende Beispielcode bietet eine vollständige Demonstration der Erstellung CloudFront signierter Dateien URLs mit PHP. Sie können das vollständige Beispiel aus der Datei [demo-php.zip](samples/demo-php.zip) herunterladen.

Im folgenden Beispiel können Sie das `$policy` `Condition` Element so ändern, dass IPv4 sowohl IPv6 Adressbereiche als auch Adressbereiche zulässig sind. Ein Beispiel finden Sie unter [ IPv6Adressen in IAM-Richtlinien verwenden](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ipv6-access.html#ipv6-access-iam) im *Amazon Simple Storage Service-Benutzerhandbuch*.

```
<?php

function rsa_sha1_sign($policy, $private_key_filename) {
    $signature = "";

    // load the private key
    $fp = fopen($private_key_filename, "r");
    $priv_key = fread($fp, 8192);
    fclose($fp);
    $pkeyid = openssl_get_privatekey($priv_key);

    // compute signature
    openssl_sign($policy, $signature, $pkeyid);

    // free the key from memory
    openssl_free_key($pkeyid);

    return $signature;
}

function url_safe_base64_encode($value) {
    $encoded = base64_encode($value);
    // replace unsafe characters +, = and / with the safe characters -, _ and ~
    return str_replace(
        array('+', '=', '/'),
        array('-', '_', '~'),
        $encoded);
}

function create_stream_name($stream, $policy, $signature, $key_pair_id, $expires) {
    $result = $stream;
    // if the stream already contains query parameters, attach the new query parameters to the end
    // otherwise, add the query parameters
    $separator = strpos($stream, '?') == FALSE ? '?' : '&';
    // the presence of an expires time means we're using a canned policy
    if($expires) {
        $result .= $separator . "Expires=" . $expires . "&Signature=" . $signature . "&Key-Pair-Id=" . $key_pair_id;
    }
    // not using a canned policy, include the policy itself in the stream name
    else {
        $result .= $separator . "Policy=" . $policy . "&Signature=" . $signature . "&Key-Pair-Id=" . $key_pair_id;
    }

    // new lines would break us, so remove them
    return str_replace('\n', '', $result);
}


function get_canned_policy_stream_name($video_path, $private_key_filename, $key_pair_id, $expires) {
    // this policy is well known by CloudFront, but you still need to sign it, since it contains your parameters
    $canned_policy = '{"Statement":[{"Resource":"' . $video_path . '","Condition":{"DateLessThan":{"AWS:EpochTime":'. $expires . '}}}]}';
    // the policy contains characters that cannot be part of a URL, so we base64 encode it
    $encoded_policy = url_safe_base64_encode($canned_policy);
    // sign the original policy, not the encoded version
    $signature = rsa_sha1_sign($canned_policy, $private_key_filename);
    // make the signature safe to be included in a URL
    $encoded_signature = url_safe_base64_encode($signature);

    // combine the above into a stream name
    $stream_name = create_stream_name($video_path, null, $encoded_signature, $key_pair_id, $expires);
    // URL-encode the query string characters
    return $stream_name;
}

function get_custom_policy_stream_name($video_path, $private_key_filename, $key_pair_id, $policy) {
    // the policy contains characters that cannot be part of a URL, so we base64 encode it
    $encoded_policy = url_safe_base64_encode($policy);
    // sign the original policy, not the encoded version
    $signature = rsa_sha1_sign($policy, $private_key_filename);
    // make the signature safe to be included in a URL
    $encoded_signature = url_safe_base64_encode($signature);

    // combine the above into a stream name
    $stream_name = create_stream_name($video_path, $encoded_policy, $encoded_signature, $key_pair_id, null);
    // URL-encode the query string characters
    return $stream_name;
}


// Path to your private key.  Be very careful that this file is not accessible
// from the web!

$private_key_filename = '/home/test/secure/example-priv-key.pem';
$key_pair_id = 'K2JCJMDEHXQW5F';

// Make sure you have "Restrict viewer access" enabled on this path behaviour and using the above Trusted key groups (recommended).
$video_path = 'https://example.com/secure/example.mp4';

$expires = time() + 300; // 5 min from now
$canned_policy_stream_name = get_canned_policy_stream_name($video_path, $private_key_filename, $key_pair_id, $expires);

// Get the viewer real IP from the x-forward-for header as $_SERVER['REMOTE_ADDR'] will return viewer facing IP. An alternative option is to use CloudFront-Viewer-Address header. Note that this header is a trusted CloudFront immutable header. Example format: IP:PORT ("CloudFront-Viewer-Address": "1.2.3.4:12345")
$client_ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
$policy =
'{'.
    '"Statement":['.
        '{'.
            '"Resource":"'. $video_path . '",'.
            '"Condition":{'.
                '"IpAddress":{"AWS:SourceIp":"' . $client_ip . '/32"},'.
                '"DateLessThan":{"AWS:EpochTime":' . $expires . '}'.
            '}'.
        '}'.
    ']' .
    '}';
$custom_policy_stream_name = get_custom_policy_stream_name($video_path, $private_key_filename, $key_pair_id, $policy);

?>

<html>

<head>
    <title>CloudFront</title>
</head>

<body>
    <h1>Amazon CloudFront</h1>
    <h2>Canned Policy</h2>
    <h3>Expires at <?php echo gmdate('Y-m-d H:i:s T', $expires); ?></h3>
    <br />

    <div id='canned'>The canned policy video will be here: <br>
    
        <video width="640" height="360" autoplay muted controls>
        <source src="<?php echo $canned_policy_stream_name; ?>" type="video/mp4">
        Your browser does not support the video tag.
        </video>
    </div>

    <h2>Custom Policy</h2>
    <h3>Expires at <?php echo gmdate('Y-m-d H:i:s T', $expires); ?> only viewable by IP <?php echo $client_ip; ?></h3>
    <div id='custom'>The custom policy video will be here: <br>

         <video width="640" height="360" autoplay muted controls>
         <source src="<?php echo $custom_policy_stream_name; ?>" type="video/mp4">
         Your browser does not support the video tag.
        </video>
    </div> 

</body>

</html>
```

Zusätzliche Beispiele für URL-Signaturen finden Sie in den folgenden Themen:
+ [Erstellen einer URL-Signatur mit Perl](CreateURLPerl.md)
+ [Erstellen einer URL-Signatur mithilfe von C\$1 und dem .NET Framework](CreateSignatureInCSharp.md)
+ [Erstellen einer URL-Signatur mit Java](CFPrivateDistJavaDevelopment.md)

Anstatt signierte Cookies zu verwenden URLs , um die Signatur zu erstellen, können Sie signierte Cookies verwenden. Weitere Informationen finden Sie unter [Erstellen signierter Cookies mit PHP](signed-cookies-PHP.md).

# Erstellen einer URL-Signatur mithilfe von C\$1 und dem .NET Framework
<a name="CreateSignatureInCSharp"></a>

Die C\$1-Beispiele in diesem Abschnitt implementieren eine Beispielanwendung, die zeigt, wie Signaturen für CloudFront private Distributionen mithilfe von vorgefertigten und benutzerdefinierten Richtlinienanweisungen erstellt werden. Die Beispiele enthalten Dienstprogrammfunktionen auf der Grundlage des [AWS SDK für .NET](https://aws.amazon.com/sdkfornet), das in .NET-Anwendungen nützlich sein kann.

Sie können signierte URLs und signierte Cookies auch mithilfe von erstellen. SDK für .NET Schlagen Sie unter den folgenden Themen in der *API-Referenz für SDK für .NET * nach:
+ **Signiert URLs** — [AmazonCloudFrontUrlSigner](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/CloudFront/TCloudFrontUrlSigner.html) 
+ **Signierte Cookies** — [AmazonCloudFrontCookieSigner](https://docs.aws.amazon.com/sdkfornet/v3/apidocs/items/CloudFront/TCloudFrontCookieSigner.html) 

Um den Code herunterzuladen, navigieren Sie zu [Signaturcode in C \$1](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/samples/AWS_PrivateCF_Distributions.zip).

**Hinweise**  
Die Klassen `AmazonCloudFrontCookieSigner` und `AmazonCloudFrontUrlSigner` wurden in ein separates Paket verschoben. Weitere Informationen zu ihrer Verwendung finden Sie unter [CookieSigner und UrlSigner](https://docs.aws.amazon.com/sdk-for-net/v4/developer-guide/net-dg-v4.html#net-dg-v4-CookieSigner-UrlSigner) im *AWS SDK für .NET (V4) Developer Guide*. 
Das Erstellen einer URL-Signatur ist nur ein Teil der Bereitstellung privater Inhalte über eine signierte URL. Weitere Informationen finden Sie unter [Verwenden Sie signierte URLs](private-content-signed-urls.md). Weitere Informationen über die Verwendung von signierten Cookies finden Sie unter [Verwenden signierter Cookies](private-content-signed-cookies.md).

## Verwenden eines RSA-Schlüssels im .NET-Framework
<a name="rsa-key-sdk-net"></a>

Um einen RSA-Schlüssel im.NET Framework zu verwenden, müssen Sie die AWS bereitgestellte PEM-Datei in das XML-Format konvertieren, das das.NET Framework verwendet.

Nach der Konvertierung weist die Datei mit dem privaten RSA-Schlüssel das folgende Format auf:

**Example : Privater RSA-Schlüssel im .NET Framework-XML-Format**  <a name="RSAPrivateKeyXML.NETFrameworkFormat"></a>

```
<RSAKeyValue>
  <Modulus>
    wO5IvYCP5UcoCKDo1dcspoMehWBZcyfs9QEzGi6Oe5y+ewGr1oW+vB2GPB
    ANBiVPcUHTFWhwaIBd3oglmF0lGQljP/jOfmXHUK2kUUnLnJp+oOBL2NiuFtqcW6h/L5lIpD8Yq+NRHg
    Ty4zDsyr2880MvXv88yEFURCkqEXAMPLE=
  </Modulus>
  <Exponent>AQAB</Exponent>
  <P>
    5bmKDaTz
    npENGVqz4Cea8XPH+sxt+2VaAwYnsarVUoSBeVt8WLloVuZGG9IZYmH5KteXEu7fZveYd9UEXAMPLE==
  </P>
  <Q>
    1v9l/WN1a1N3rOK4VGoCokx7kR2SyTMSbZgF9IWJNOugR/WZw7HTnjipO3c9dy1Ms9pUKwUF4
    6d7049EXAMPLE==
  </Q>
  <DP>
    RgrSKuLWXMyBH+/l1Dx/I4tXuAJIrlPyo+VmiOc7b5NzHptkSHEPfR9s1
    OK0VqjknclqCJ3Ig86OMEtEXAMPLE==
  </DP>
  <DQ>
    pjPjvSFw+RoaTu0pgCA/jwW/FGyfN6iim1RFbkT4
    z49DZb2IM885f3vf35eLTaEYRYUHQgZtChNEV0TEXAMPLE==
  </DQ>
  <InverseQ>
    nkvOJTg5QtGNgWb9i
    cVtzrL/1pFEOHbJXwEJdU99N+7sMK+1066DL/HSBUCD63qD4USpnf0myc24in0EXAMPLE==</InverseQ>
  <D>
      Bc7mp7XYHynuPZxChjWNJZIq+A73gm0ASDv6At7F8Vi9r0xUlQe/v0AQS3ycN8QlyR4XMbzMLYk
      3yjxFDXo4ZKQtOGzLGteCU2srANiLv26/imXA8FVidZftTAtLviWQZBVPTeYIA69ATUYPEq0a5u5wjGy
      UOij9OWyuEXAMPLE=
   </D>
</RSAKeyValue>
```

## Signaturmethode für vordefinierte Richtlinien in C\$1
<a name="canned-policy-signed-url-net"></a>

Der folgende C\$1-Code erstellt eine signierte URL, die eine vordefinierte Richtlinie verwendet, indem die folgenden Schritte ausgeführt werden:
+ Es wird eine Richtlinienanweisung erstellt.
+ Hasht die Richtlinienanweisung mit RSA und dem privaten Schlüssel SHA1, dessen entsprechender öffentlicher Schlüssel sich in einer vertrauenswürdigen Schlüsselgruppe befindet, und signiert das Ergebnis mit diesem.
+ Die gehashte und signierte Richtlinienanweisung wird in Base64 codiert. Dabei werden Sonderzeichen ersetzt, damit die Zeichenfolge sicher als URL-Anfrageparameter verwendet werden kann.
+ Verkettet die Werte.

Ein Beispiel für die vollständige Implementierung finden Sie unter [Signaturcode in C\$1](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/samples/AWS_PrivateCF_Distributions.zip). 

**Anmerkung**  
Das `keyId` wird zurückgegeben, wenn Sie einen öffentlichen Schlüssel in hochladen. CloudFront Weitere Informationen finden Sie unter ![\[6\]](http://docs.aws.amazon.com/de_de/AmazonCloudFront/latest/DeveloperGuide/images/callouts/6.png)[ &Key-Pair-Id](private-content-creating-signed-url-canned-policy.md).

**Example : Signaturmethode für vordefinierte Richtlinien in C\$1**  <a name="ExampleCannedPolicySigningMethod-CSharp"></a>

```
public static string ToUrlSafeBase64String(byte[] bytes)
{
    return System.Convert.ToBase64String(bytes)
        .Replace('+', '-')
        .Replace('=', '_')
        .Replace('/', '~');
}

public static string CreateCannedPrivateURL(string urlString, 
    string durationUnits, string durationNumber, string pathToPolicyStmnt, 
    string pathToPrivateKey, string keyId)
{
    // args[] 0-thisMethod, 1-resourceUrl, 2-seconds-minutes-hours-days 
    // to expiration, 3-numberOfPreviousUnits, 4-pathToPolicyStmnt, 
    // 5-pathToPrivateKey, 6-keyId

    TimeSpan timeSpanInterval = GetDuration(durationUnits, durationNumber);

    // Create the policy statement.
    string strPolicy = CreatePolicyStatement(pathToPolicyStmnt,
        urlString, 
        DateTime.Now, 
        DateTime.Now.Add(timeSpanInterval), 
        "0.0.0.0/0");
    if ("Error!" == strPolicy) return "Invalid time frame." + 
        "Start time cannot be greater than end time.";

    // Copy the expiration time defined by policy statement.
    string strExpiration = CopyExpirationTimeFromPolicy(strPolicy);

    // Read the policy into a byte buffer.
    byte[] bufferPolicy = Encoding.ASCII.GetBytes(strPolicy);

    // Initialize the SHA1CryptoServiceProvider object and hash the policy data.
    using (SHA1CryptoServiceProvider 
        cryptoSHA1 = new SHA1CryptoServiceProvider())
    {
        bufferPolicy = cryptoSHA1.ComputeHash(bufferPolicy);

        // Initialize the RSACryptoServiceProvider object.
        RSACryptoServiceProvider providerRSA = new RSACryptoServiceProvider();
        XmlDocument xmlPrivateKey = new XmlDocument();

        // Load your private key, which you created by converting your 
        // .pem file to the XML format that the .NET framework uses.  
        // Several tools are available. 
        xmlPrivateKey.Load(pathToPrivateKey);

        // Format the RSACryptoServiceProvider providerRSA and 
        // create the signature.
        providerRSA.FromXmlString(xmlPrivateKey.InnerXml);
        RSAPKCS1SignatureFormatter rsaFormatter = 
            new RSAPKCS1SignatureFormatter(providerRSA);
        rsaFormatter.SetHashAlgorithm("SHA1");
        byte[] signedPolicyHash = rsaFormatter.CreateSignature(bufferPolicy);

        // Convert the signed policy to URL-safe base64 encoding and 
        // replace unsafe characters + = / with the safe characters - _ ~
        string strSignedPolicy = ToUrlSafeBase64String(signedPolicyHash);

        // Concatenate the URL, the timestamp, the signature, 
        // and the key pair ID to form the signed URL.
        return urlString + 
            "?Expires=" + 
            strExpiration + 
            "&Signature=" + 
            strSignedPolicy + 
            "&Key-Pair-Id=" + 
            keyId;
    }
}
```

## Signaturmethode für benutzerdefinierte Richtlinien in C\$1
<a name="custom-policy-signed-url-net"></a>

Der folgende C\$1-Code erstellt eine signierte URL, die eine benutzerdefinierte Richtlinie verwendet, indem die folgenden Schritte ausgeführt werden:

1. Es wird eine Richtlinienanweisung erstellt.

1. Die Richtlinienanweisung wird in Base64 codiert. Dabei werden Sonderzeichen ersetzt, damit die Zeichenfolge sicher als URL-Anfrageparameter verwendet werden kann.

1. Hasht die Richtlinienanweisung mithilfe von RSA und des privaten Schlüssels SHA1, dessen entsprechender öffentlicher Schlüssel sich in einer vertrauenswürdigen Schlüsselgruppe befindet, und verschlüsselt das Ergebnis mithilfe von RSA.

1. Die gehashte Richtlinienanweisung wird in Base64 codiert. Dabei werden Sonderzeichen ersetzt, damit die Zeichenfolge sicher als URL-Anfrageparameter verwendet werden kann.

1. Verkettet die Werte.

Ein Beispiel für die vollständige Implementierung finden Sie unter [Signaturcode in C\$1](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/samples/AWS_PrivateCF_Distributions.zip). 

**Anmerkung**  
Das `keyId` wird zurückgegeben, wenn Sie einen öffentlichen Schlüssel in hochladen. CloudFront Weitere Informationen finden Sie unter ![\[6\]](http://docs.aws.amazon.com/de_de/AmazonCloudFront/latest/DeveloperGuide/images/callouts/6.png)[ &Key-Pair-Id](private-content-creating-signed-url-canned-policy.md).

**Example : Signaturmethode für benutzerdefinierte Richtlinien in C\$1**  <a name="ExampleCustomPolicySigningMethod-CSharp"></a>

```
public static string ToUrlSafeBase64String(byte[] bytes)
{
    return System.Convert.ToBase64String(bytes)
        .Replace('+', '-')
        .Replace('=', '_')
        .Replace('/', '~');
}

public static string CreateCustomPrivateURL(string urlString, 
    string durationUnits, string durationNumber, string startIntervalFromNow, 
    string ipaddress, string pathToPolicyStmnt, string pathToPrivateKey, 
    string keyId)
{
    // args[] 0-thisMethod, 1-resourceUrl, 2-seconds-minutes-hours-days 
    // to expiration, 3-numberOfPreviousUnits, 4-starttimeFromNow, 
    // 5-ip_address, 6-pathToPolicyStmt, 7-pathToPrivateKey, 8-keyId

    TimeSpan timeSpanInterval = GetDuration(durationUnits, durationNumber);
    TimeSpan timeSpanToStart = GetDurationByUnits(durationUnits, 
        startIntervalFromNow);
    if (null == timeSpanToStart) 
        return "Invalid duration units." + 
            "Valid options: seconds, minutes, hours, or days";
            
    string strPolicy = CreatePolicyStatement(
        pathToPolicyStmnt, urlString, DateTime.Now.Add(timeSpanToStart), 
        DateTime.Now.Add(timeSpanInterval), ipaddress);

    // Read the policy into a byte buffer.
    byte[] bufferPolicy = Encoding.ASCII.GetBytes(strPolicy);

    // Convert the policy statement to URL-safe base64 encoding and 
    // replace unsafe characters + = / with the safe characters - _ ~

    string urlSafePolicy = ToUrlSafeBase64String(bufferPolicy);

    // Initialize the SHA1CryptoServiceProvider object and hash the policy data.
    byte[] bufferPolicyHash;
    using (SHA1CryptoServiceProvider cryptoSHA1 = 
        new SHA1CryptoServiceProvider())
    {
        bufferPolicyHash = cryptoSHA1.ComputeHash(bufferPolicy);

        // Initialize the RSACryptoServiceProvider object.
        RSACryptoServiceProvider providerRSA = new RSACryptoServiceProvider();
        XmlDocument xmlPrivateKey = new XmlDocument();

        // Load your private key, which you created by converting your 
        // .pem file to the XML format that the .NET framework uses.  
        // Several tools are available. 
        xmlPrivateKey.Load(pathToPrivateKey);

        // Format the RSACryptoServiceProvider providerRSA 
        // and create the signature.
        providerRSA.FromXmlString(xmlPrivateKey.InnerXml);
        RSAPKCS1SignatureFormatter RSAFormatter = 
            new RSAPKCS1SignatureFormatter(providerRSA);
        RSAFormatter.SetHashAlgorithm("SHA1");
        byte[] signedHash = RSAFormatter.CreateSignature(bufferPolicyHash);

        // Convert the signed policy to URL-safe base64 encoding and 
        // replace unsafe characters + = / with the safe characters - _ ~
        string strSignedPolicy = ToUrlSafeBase64String(signedHash);

        return urlString + 
            "?Policy=" + 
            urlSafePolicy + 
            "&Signature=" + 
            strSignedPolicy + 
            "&Key-Pair-Id=" + 
            keyId;
    }
}
```

## Dienstprogrammmethoden für die Generierung von Signaturen
<a name="utility-methods-signed-url"></a>

Mit den folgenden Methoden lassen sich die Richtlinienanweisung aus einer Datei abrufen und Zeitintervalle für die Generierung von Signaturen parsen.

**Example : Dienstprogrammmethoden für die Generierung von Signaturen**  <a name="UtilityMethodsForSignatureGeneration"></a>

```
public static string CreatePolicyStatement(string policyStmnt, 
   string resourceUrl, 
   DateTime startTime, 
   DateTime endTime, 
   string ipAddress)
   
{
   // Create the policy statement.
   FileStream streamPolicy = new FileStream(policyStmnt, FileMode.Open, FileAccess.Read);
   using (StreamReader reader = new StreamReader(streamPolicy))
   {
      string strPolicy = reader.ReadToEnd();

      TimeSpan startTimeSpanFromNow = (startTime - DateTime.Now);
      TimeSpan endTimeSpanFromNow = (endTime - DateTime.Now);
      TimeSpan intervalStart = 
         (DateTime.UtcNow.Add(startTimeSpanFromNow)) - 
         new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
      TimeSpan intervalEnd = 
         (DateTime.UtcNow.Add(endTimeSpanFromNow)) - 
         new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);

      int startTimestamp = (int)intervalStart.TotalSeconds; // START_TIME
      int endTimestamp = (int)intervalEnd.TotalSeconds;  // END_TIME

      if (startTimestamp > endTimestamp)
         return "Error!";

      // Replace variables in the policy statement.
      strPolicy = strPolicy.Replace("RESOURCE", resourceUrl);
      strPolicy = strPolicy.Replace("START_TIME", startTimestamp.ToString());
      strPolicy = strPolicy.Replace("END_TIME", endTimestamp.ToString());
      strPolicy = strPolicy.Replace("IP_ADDRESS", ipAddress);
      strPolicy = strPolicy.Replace("EXPIRES", endTimestamp.ToString());
      return strPolicy;
   }   
}

public static TimeSpan GetDuration(string units, string numUnits)
{
   TimeSpan timeSpanInterval = new TimeSpan();
   switch (units)
   {
      case "seconds":
         timeSpanInterval = new TimeSpan(0, 0, 0, int.Parse(numUnits));
         break;
      case "minutes":
         timeSpanInterval = new TimeSpan(0, 0, int.Parse(numUnits), 0);
         break;
      case "hours":
         timeSpanInterval = new TimeSpan(0, int.Parse(numUnits), 0 ,0);
         break;
      case "days":
         timeSpanInterval = new TimeSpan(int.Parse(numUnits),0 ,0 ,0);
         break;
      default:
         Console.WriteLine("Invalid time units;" + 
            "use seconds, minutes, hours, or days");
         break;
   }
   return timeSpanInterval;
}

private static TimeSpan GetDurationByUnits(string durationUnits, 
   string startIntervalFromNow)
{
   switch (durationUnits)
   {
      case "seconds":
         return new TimeSpan(0, 0, int.Parse(startIntervalFromNow));
      case "minutes":
         return new TimeSpan(0, int.Parse(startIntervalFromNow), 0);
      case "hours":
         return new TimeSpan(int.Parse(startIntervalFromNow), 0, 0);
      case "days":
         return new TimeSpan(int.Parse(startIntervalFromNow), 0, 0, 0);
      default:
         return new TimeSpan(0, 0, 0, 0);
   }
}

public static string CopyExpirationTimeFromPolicy(string policyStatement)
{
   int startExpiration = policyStatement.IndexOf("EpochTime");
   string strExpirationRough = policyStatement.Substring(startExpiration + 
      "EpochTime".Length);
   char[] digits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
         
   List<char> listDigits = new List<char>(digits);
   StringBuilder buildExpiration = new StringBuilder(20);
         
   foreach (char c in strExpirationRough)
   {
      if (listDigits.Contains(c))
         buildExpiration.Append(c);
   }
   return buildExpiration.ToString();   
}
```

Weitere Informationen finden Sie auch unter
+ [Erstellen einer URL-Signatur mit Perl](CreateURLPerl.md)
+ [Erstellen einer URL-Signatur mit PHP](CreateURL_PHP.md)
+ [Erstellen einer URL-Signatur mit Java](CFPrivateDistJavaDevelopment.md)

# Erstellen einer URL-Signatur mit Java
<a name="CFPrivateDistJavaDevelopment"></a>

Zusätzlich zum folgenden Codebeispiel können Sie die [`CloudFrontUrlSigner`Utility-Klasse in der AWS SDK für Java (Version 1)](https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/cloudfront/CloudFrontUrlSigner.html) verwenden, um [CloudFront signierte](private-content-signed-urls.md) zu erstellenURLs.

Weitere Beispiele finden Sie unter [Erstellen von signierten Cookies URLs und Cookies mithilfe eines AWS SDK](https://docs.aws.amazon.com/code-library/latest/ug/cloudfront_example_cloudfront_CloudFrontUtilities_section.html) in der *Codebibliothek für AWS SDK-Codebeispiele*. 

**Anmerkung**  
Das Erstellen einer signierten URL ist nur ein Teil des Prozesses der [Bereitstellung privater Inhalte mit CloudFront](PrivateContent.md). Weitere Informationen zum gesamten Prozess finden Sie unter [Verwenden Sie signierte URLs](private-content-signed-urls.md).

Das folgende Beispiel zeigt, wie eine CloudFront signierte URL erstellt wird.

**Example Java-Richtlinie und Verschlüsselungsmethoden für Signaturen**  <a name="ExampleJavaPolicyAndSignatureEncryptionMethods"></a>

```
package org.example;

import java.time.Instant;
import java.time.temporal.ChronoUnit;
import software.amazon.awssdk.services.cloudfront.CloudFrontUtilities;
import software.amazon.awssdk.services.cloudfront.model.CannedSignerRequest;
import software.amazon.awssdk.services.cloudfront.url.SignedUrl;

public class Main {

    public static void main(String[] args) throws Exception {
        CloudFrontUtilities cloudFrontUtilities = CloudFrontUtilities.create();
        Instant expirationDate = Instant.now().plus(7, ChronoUnit.DAYS);
        String resourceUrl = "https://a1b2c3d4e5f6g7.cloudfront.net";
        String keyPairId = "K1UA3WV15I7JSD";
        CannedSignerRequest cannedRequest = CannedSignerRequest.builder()
                .resourceUrl(resourceUrl)
                .privateKey(new java.io.File("/path/to/private_key.pem").toPath())
                .keyPairId(keyPairId)
                .expirationDate(expirationDate)
                .build();
        SignedUrl signedUrl = cloudFrontUtilities.getSignedUrlWithCannedPolicy(cannedRequest);
        String url = signedUrl.url();
        System.out.println(url);

    }
}
```

Weitere Informationen finden Sie auch unter:
+ [Erstellen einer URL-Signatur mit Perl](CreateURLPerl.md)
+ [Erstellen einer URL-Signatur mit PHP](CreateURL_PHP.md)
+ [Erstellen einer URL-Signatur mithilfe von C\$1 und dem .NET Framework](CreateSignatureInCSharp.md)