# Amazon S3 und CloudFront: Schritt für Schritt Verbinden Sie einen privaten S3-Bucket mit DRM-X 6.0 mit bereichsbezogenen IAM-Berechtigungen, Browser CORS, CloudFront HTTPS-Zustellung und einer Checkliste zur Upload-Verifizierung. Verschlüsselte Videos und DRM-Lizenzen werden getrennt übertragen Das CDN liefert verschlüsselte Videos. Ihr Backend prüft den Zugriff; der DRM-Lizenzdienst autorisiert die Entschlüsselung auf einem kompatiblen Gerät. - 01**Speicher / CDN** Liefert verschlüsselte Medien an den Player. - 02**Ihr Backend** Prüft die Zugriffsberechtigung des Zuschauers und fordert bei DRM-X die Wiedergabeautorisierung an. - 03**DRM-X** Validiert die Wiedergabeautorisierung und verarbeitet die DRM-Lizenzanfrage. - 04**Player + Gerät** Verwendet das DRM-System des Geräts, um eine Lizenz zu erhalten und die verschlüsselten Medien abzuspielen. Ihr Backend entscheidet über den Zugriff; DRM-X erzwingt die unterschriebene Richtlinie. Verschlüsselte Medien und DRM Lizenzen folgen getrennten Lieferwegen. **Vom privaten Bucket zur öffentlichen Auslieferung verschlüsselter Medien** Erstellen Sie einen S3-Bucket, geben Sie DRM-X eingeschränkte Upload-Zugangsdaten, konfigurieren Sie Browser-CORS und verbinden Sie CloudFront. Laden Sie ein Testobjekt hoch und rufen Sie es ab. Bewahren Sie Originalvideos und private Dateien außerhalb dieses Auslieferungs-Buckets auf. ## 1. Verstehen Sie den Zusammenhang[#](#architecture) DRM-X lädt Dateien mit signierten Anfragen direkt zu S3 hoch. Zuschauer laden die verschlüsselten Medien über CloudFront per HTTPS herunter. Lassen Sie **Block all public access** in S3 aktiviert. CloudFront erhält über **Origin Access Control (OAC)** eingeschränkten Lesezugriff. CloudFront stellt eine produktionsgeeignete Domain `https://….cloudfront.net` bereit. Eine eigene Domain ist optional. Bei öffentlicher Auslieferung sind die Mediendaten abrufbar; DRM kontrolliert weiterhin die Entschlüsselung korrekt verpackter Medien. CORS ist keine Zugriffskontrolle. Diese Anleitung verwendet eine gewöhnliche öffentliche CDN-Auslieferung. Signierte URLs oder Cookies für Zuschauer erfordern eine separate Integration. ## 2. Erstellen Sie Ihren S3 Bucket[#](#create-bucket) ![AWS S3 Erstellungsformular: General purpose, Global namespace und ein Beispiel-Bucket-Name.](https://docs.drm-x.com/assets/storage/s3-create.png)12**1:** wählen Sie General purpose. **2:** Geben Sie Ihren eigenen, eindeutigen Namen ein. Dies ist ein echtes Konsolenformular mit einem nicht übermittelten Beispiel. Kontoköpfe sind ausgeschlossen. - Öffnen Sie **Amazon S3 → General purpose buckets → Create bucket**. - Wählen Sie eine Region aus und notieren Sie ihren Code, z. B. `us-east-1`. Wählen Sie **General purpose**. Wenn Sie nach einem Namespace gefragt werden, verwenden Sie für diese exemplarische Vorgehensweise **Global namespace**. - Geben Sie Ihren eigenen, weltweit eindeutigen Bucket-Namen ein. Halten Sie **Object Ownership → ACLs disabled (Bucket owner enforced)**. - Lassen Sie **Block all public access** aktiviert. Sie gewähren CloudFront Zugriff über eine bereichsbezogene Richtlinie. - Behalten Sie für diese Anleitung **Default encryption → Server-side encryption with Amazon S3 managed keys (SSE-S3)** bei. Die Speicherverschlüsselung ergänzt das DRM-Packaging, ersetzt es aber nicht. SSE-KMS erfordert zusätzliche KMS-Berechtigungen für den Uploader und CloudFront. - Überprüfen und erstellen Sie den Bucket. Aktivieren Sie S3 statisches Website-Hosting nicht. ## 3. Einen IAM-Benutzer mit eingeschränkten Rechten und einen Zugriffsschlüssel erstellen[#](#iam-credentials) - Öffnen Sie **IAM → Policies → Create policy → JSON**. Fügen Sie die Richtlinie unten ein und ersetzen Sie dabei überall den Beispiel-Bucket-Namen. - Das Beispiel erlaubt nur `protected/`. Wenn Sie einen anderen Basispfad verwenden, aktualisieren Sie sowohl die Präfixbedingung als auch das Objekt ARN. Entfernen Sie für die Bucket-Root-Verwendung die Präfixbedingung ListBucket und verwenden Sie `arn:aws:s3:::YOUR_BUCKET/*` für Objekte. - Speichern Sie die Richtlinie. Öffnen Sie **IAM → Users → Create user**, erstellen Sie einen dedizierten Integrationsbenutzer ohne AWS Console Zugriff und hängen Sie nur diese Richtlinie an. - Öffnen Sie **Security credentials → Access keys → Create access key** des Benutzers. Wählen Sie den Anwendungsfall für eine Anwendung, die außerhalb von AWS ausgeführt wird, und befolgen Sie die Anweisungen. Bewahren Sie die Access key ID und Secret access key für DRM-X sicher auf. ``` { "Version": "2012-10-17", "Statement": [ { "Sid": "ListProtectedFolder", "Effect": "Allow", "Action": "s3:ListBucket", "Resource": "arn:aws:s3:::customer-drm-media-example", "Condition": { "StringLike": { "s3:prefix": [ "protected", "protected/", "protected/*" ] } } }, { "Sid": "BucketRegion", "Effect": "Allow", "Action": "s3:GetBucketLocation", "Resource": "arn:aws:s3:::customer-drm-media-example" }, { "Sid": "ManageProtectedObjects", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:PutObject", "s3:DeleteObject" ], "Resource": "arn:aws:s3:::customer-drm-media-example/protected/*" } ] } ``` Verwenden Sie keine Root-Schlüssel oder AdministratorAccess. Beim Kopieren werden GetObject und PutObject verwendet; Es gibt keine separate Aktion `s3:CopyObject` IAM. Für die Umbenennung ist ebenfalls DeleteObject erforderlich. Diese Anleitung folgt dem aktuellen Zugriffsschlüsselformular von DRM-X; Eine Rolle ARN allein ersetzt nicht das Schlüsselpaar. ## 4. Konfigurieren Sie S3 CORS für Browser-Uploads[#](#bucket-cors) - Öffnen Sie Ihren S3-Bucket → **Permissions**. - Scrollen Sie zu **Cross-origin resource sharing (CORS) → Bearbeiten**. - Fügen Sie dieses JSON ein und ersetzen Sie `https://www.example.com` durch die Website, auf der Ihr Player eingebettet ist. Behalten Sie den Ursprung DRM-X Console bei. Behalten Sie andere erforderliche Regeln in vorhandenen Buckets bei. - Wählen Sie **Save changes**. Lassen Sie Block Public Access aktiviert: CORS macht den Bucket nicht öffentlich. ``` [ { "AllowedOrigins": [ "https://6.drm-x.com" ], "AllowedMethods": [ "PUT" ], "AllowedHeaders": [ "Content-Type", "x-amz-meta-drmx-sha256" ], "ExposeHeaders": [ "ETag" ], "MaxAgeSeconds": 3600 }, { "AllowedOrigins": [ "https://6.drm-x.com", "https://multi-drm.drm-x.com", "https://www.example.com" ], "AllowedMethods": [ "GET", "HEAD" ], "AllowedHeaders": [ "Range" ], "ExposeHeaders": [ "ETag", "Content-Length", "Content-Range", "Accept-Ranges" ], "MaxAgeSeconds": 3600 } ] ``` Uploads gehen direkt zu S3, also gehört PUT CORS zu S3. Für die Wiedergabe über CloudFront ist außerdem die CDN-Konfiguration in Schritt 5 erforderlich. ## 5. Mit CloudFront eine HTTPS-Auslieferungs-URL einrichten[#](#cloudfront) - Öffnen Sie **CloudFront → Distributions → Create distribution**. Verwenden Sie eine Standardverteilung. Wenn AWS eine Onboarding- oder Preisplanauswahl anzeigt, überprüfen Sie den für Ihr Konto geeigneten Plan und wählen Sie ihn aus, bevor Sie Ressourcen erstellen. - Wählen Sie den normalen **S3 REST origin** des Buckets aus, nicht seinen Website-Endpunkt. Lassen Sie **Origin path leer** für die in diesem Handbuch verwendete Ordnerzuordnung. - Wählen Sie **Origin access control settings (recommended)**. Erstellen oder wählen Sie eine OAC mit **Sign requests (recommended)** aus. - Stellen Sie die Viewer-Protokollrichtlinie auf **Redirect HTTP to HTTPS** oder **HTTPS only** ein. Erlaube **GET, HEAD, OPTIONS**. Uploads verwenden den Endpunkt S3, sodass CloudFront PUT nicht benötigt. - Erstellen Sie die Verteilung. Wenden Sie die von CloudFront generierte Bucket-Richtlinie unter **S3 → Bucket → Permissions → Bucket policy → Bearbeiten** an. Mit erforderlichen vorhandenen Anweisungen zusammenführen. Beschränken Sie den Zugriff auf ARN dieser Distribution. Das folgende Beispiel beschränkt den Wert auf `protected/`. - Öffnen Sie **CloudFront → Policies → Response headers → Create response headers policy**. Konfigurieren Sie die CORS-Felder in der folgenden Tabelle. Hängen Sie diese Richtlinie an das Medien-/Standardverhalten der Distribution an. - Warten Sie, bis die Bereitstellung abgeschlossen ist. Kopieren Sie **Distribution domain name**. Ihr Lieferursprung ist `https://YOUR_DISTRIBUTION.cloudfront.net`. | Response headers Richtlinienfeld | Wert | | --- | --- | | Access-Control-Allow-Origin | Die genauen Origins Ihrer Player-Websites sowie `https://6.drm-x.com` und `https://multi-drm.drm-x.com` für DRM-X-Tests. | | Access-Control-Allow-Methods | GET, HEAD, OPTIONS | | Access-Control-Allow-Headers | Range | | Access-Control-Expose-Headers | ETag, Content-Length, Content-Range, Accept-Ranges | | Access-Control-Allow-Credentials | Für diesen öffentlichen Workflow für verschlüsselte Medien deaktiviert. | | Access-Control-Max-Age | 3600 | | Origin override | Aktiviert, damit CloudFront den auf den Betrachter gerichteten CORS konsistent steuert. | Hängen Sie für OPTIONS Preflight die verwaltete Ursprungsanforderungsrichtlinie **CORS-S3Origin** an. Es leitet Origin, Access-Control-Request-Method und Access-Control-Request-Headers an S3 weiter. Zunächst nur GET/HEAD zwischenspeichern, das Caching von OPTIONS bleibt deaktiviert. Wenn Sie OPTIONS später zwischenspeichern, fügen Sie diese Header in seinen Cache-Schlüssel ein und testen Sie verschiedene Player-Ursprünge; Durch die alleinige Weiterleitung eines Headers wird dieser nicht zum Cache-Schlüssel hinzugefügt. ``` { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowThisCloudFrontDistribution", "Effect": "Allow", "Principal": { "Service": "cloudfront.amazonaws.com" }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::customer-drm-media-example/protected/*", "Condition": { "StringEquals": { "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/EEXAMPLE123" } } } ] } ``` Ersetzen Sie das Beispielkonto ID, die Verteilung ID und den Bucket-Namen. Das SourceArn muss die Distribution identifizieren, die Sie gerade erstellt haben. Machen Sie nach Header-Änderungen betroffene Test-/Medienpfade ungültig, wenn frühere Antworten zwischengespeichert bleiben. ### Optional: media.example.com verwenden - Fordern Sie ein öffentliches ACM-Zertifikat an, das Ihren Hostnamen in **US East (N. Virginia), us-east-1** abdeckt, und schließen Sie die DNS-Validierung ab. - Fügen Sie den Hostnamen unter **Alternate domain names** der Distribution hinzu und hängen Sie das Zertifikat an. - Erstellen Sie bei Ihrem DNS-Anbieter den CNAME- oder unterstützten Alias, der auf den CloudFront-Hostnamen verweist. Warten Sie auf DNS, die Bereitstellung des Zertifikats und der Verteilung. - Verwenden Sie `https://media.example.com` als Lieferursprung. Ein DNS CNAME allein reicht ohne die CloudFront-Domänen- und Zertifikatseinrichtung nicht aus. ## 6. Verbinden Sie Amazon S3 mit DRM-X 6.0[#](#connect-drmx) Öffnen Sie [Cloud Storage → Connect storage](https://6.drm-x.com/console/cloud-storage). Wählen Sie **Amazon S3**. | Feld | Was einzugeben ist | | --- | --- | | Display name | Ein freundliches Label, z. B. Produktion S3. | | Bucket name | Der genaue Name, ohne `s3://`. | | Region | Der genaue AWS-Regionalcode des Buckets. | | Protected-content base path | `protected`, passend zu den IAM- und Bucket-Richtlinien. | | Public URL prefix | `https://YOUR_DISTRIBUTION.cloudfront.net/protected` oder `https://media.example.com/protected`. | | Access key ID / Secret access key | Das Schlüsselpaar des dedizierten IAM-Benutzers. | Die Beispiele verwenden einen Ordner namens `protected`. Der Bucket-Name ist nicht automatisch ein Ordner. Mit der hier verwendeten direkten Domänen-zu-Bucket-Zuordnung fügen Sie denselben Speicherordner genau einmal in das öffentliche Präfix URL ein. ``` Bucket: customer-drm-media-example Protected-content base path: protected Public URL prefix: https://media.example.com/protected File selected for upload: sample.encrypted.bin Object key in the bucket: protected/sample.encrypted.bin Preview URL: https://media.example.com/protected/sample.encrypted.bin ``` Um den Bucket-Stamm zu verwenden, lassen Sie den Basispfad leer und geben Sie nur den Lieferursprung als öffentliches Präfix ein. Hängen Sie keinen Bucket-Namen an, es sei denn, Sie verwenden ihn absichtlich als Ordner. Lassen Sie CloudFront Origin path für diese Zuordnung leer. Wählen Sie bei Bedarf das Standard-Upload-Ziel und dann **Save and verify**. Der Hostname S3 API ist nicht Ihre CloudFront Lieferung URL. ### Generieren Sie Ihre CORS- und passenden URL-Felder Dieses Tool läuft in Ihrem Browser. Geben Sie nur öffentliche Ursprünge ein. Es werden keine Zugangsschlüssel abgefragt. Origins der Player-WebsitesErsetzen Sie das Beispiel. Trennen Sie mehrere HTTPS-Ursprünge durch Leerzeichen oder Kommas. Nutzen Sie die Website, in die Sie Ihren Player einbetten, ohne einen Seitenpfad. DRM-X Console und Playback Lab werden automatisch berücksichtigt.Öffentlicher Auslieferungs-OriginGeben Sie Ihre verbundene eigene Domain, aktivierte r2.dev-URL oder den CloudFront-Origin ohne Ordnerpfad ein.Speicherordner (optional)Konfiguration generieren Kopieren CORS JSON ``` ``` Protected-content base path``Public URL prefix``Beispielobjektschlüssel``Beispiel einer vollständigen URL`` ## 7. Laden Sie eine Datei hoch und überprüfen Sie, ob sie funktioniert[#](#test-upload) - Öffnen Sie [Cloud Storage](https://6.drm-x.com/console/cloud-storage), wählen Sie dieses Ziel und anschließend **Verify location**. Ein Erfolg bestätigt nur, dass der DRM-X-Server den Bucket auflisten kann. Schreibrechte, Browser-CORS und öffentliche Auslieferung werden damit nicht bestätigt. - Wählen Sie **Upload encrypted files** und wählen Sie ein kleines verschlüsseltes Segment aus einem vorhandenen DRM-X-Paket. Wenn Sie kein Paket haben, verwenden Sie die unten stehende verschlüsselte Einwegdiagnose. Laden Sie kein Originalvideo oder persönliches Dokument hoch. - Warten Sie auf die Erfolgsmeldung. Überprüfen Sie, ob der Dateiname und die Größe in Cloud Storage angezeigt werden. Finden Sie dasselbe Objekt unter `protected/` in Ihrer Provider-Konsole. - Klicken Sie auf **Preview URL** und testen Sie dasselbe Objekt in einem privaten Browserfenster. Es sollte HTTP 200 herunterladen oder zurückgeben, ohne dass ein AWS- oder Cloudflare-Login erforderlich ist. Testen Sie ein tatsächliches Objekt: Der Stamm einer Domäne kann 403/404 zurückgeben, selbst wenn die Objektzustellung funktioniert. - Überprüfen Sie die Cross-Origin-Zustellung auf Ihrer Player-Website. Im Netzwerkfenster des Browsers sollte `Access-Control-Allow-Origin` entsprechend dem Ursprung der Player-Seite angezeigt werden. Ein direkter Download der Adressleiste testet CORS nicht. Das folgende Terminalbeispiel überprüft auch die Header. - Entfernen Sie anschließend nur Ihr Einweg-Diagnoseobjekt. Folgen Sie dann der [Desktop Packager-Anleitung](https://docs.drm-x.com/de/packaging/desktop), wählen Sie dieses Speicherziel in Package content aus und laden Sie das vollständige verschlüsselte Paket hoch. Beim manuellen Hochladen einer Datei wird kein Published Content ID registriert. - Testen Sie die resultierende Published-Datei in [Universal Playback Lab](https://multi-drm.drm-x.com/de/player) und Ihrer eigenen Player-Website. Überprüfen Sie Video, Audio, Suche und Ihre erforderlichen Geräte. Ein erfolgreicher Binär-Download ist kein Beweis für die DRM-Wiedergabe. Kein verschlüsseltes Beispiel? Erstellen Sie am Windows eine Einweg-Testdatei Führen Sie dies in Windows PowerShell in einem temporären Ordner aus, den Sie kontrollieren. Es verschlüsselt eine kurze, nicht persönliche Nachricht mit einem einmaligen AES-Schlüssel, der nur im Speicher gespeichert wird. Die Ausgabe ist eine Speicherdiagnose, kein abspielbares Medium; es enthält keinen DRM Inhaltsschlüssel oder Kundendaten. ``` $samplePath = Join-Path (Get-Location) 'drmx-storage-check.encrypted.bin' if (Test-Path -LiteralPath $samplePath) { throw 'Choose a new folder; this test file already exists.' } $aes = [System.Security.Cryptography.Aes]::Create() try { $aes.GenerateKey() $aes.GenerateIV() $encryptor = $aes.CreateEncryptor() try { $bytes = [Text.Encoding]::UTF8.GetBytes('DRM-X disposable storage check') $encrypted = $encryptor.TransformFinalBlock($bytes, 0, $bytes.Length) [IO.File]::WriteAllBytes($samplePath, $encrypted) } finally { $encryptor.Dispose() } } finally { $aes.Dispose() } Get-Item -LiteralPath $samplePath | Select-Object Name, Length ``` Laden Sie `drmx-storage-check.encrypted.bin` hoch, überprüfen Sie seine Größe und Preview URL und entfernen Sie es dann aus dem Bucket. ``` curl.exe -I -H "Origin: https://www.example.com" "https://media.example.com/protected/sample.encrypted.bin" ``` Ersetzen Sie beide URLs. Erwarten Sie HTTP 200 und einen zulässigen Ursprung, der Ihrer Player-Website entspricht. Für die Bereichszustellung sollte eine GET-Anfrage mit `Range: bytes=0-15` HTTP 206 und einen gültigen Content-Range-Header zurückgeben. Medientypen MIME beibehalten: DASH Manifeste verwenden application/dash+xml, HLS Wiedergabelisten verwenden application/vnd.apple.mpegurl und Mediendateien müssen ihren entsprechenden Medientyp verwenden. ## 8. Beheben Sie Fehler bei Ihrem Ergebnis[#](#troubleshooting) | Result | Aktion | | --- | --- | | Verify location ist erfolgreich, aber der Upload schlägt fehl | Überprüfen Sie den Browser Console und die Netzwerkfenster. Erlauben Sie PUT CORS vom genauen Console-Ursprung und Content-Type. Überprüfen Sie außerdem die Konnektivität und versuchen Sie es erneut, um ein neues vorsigniertes URL zu erhalten. | | Upload gibt 403 zurück | Überprüfen Sie die Objektschreibberechtigung, den Bucket-/Ordnerbereich, den Endpunkt, die Region, den Anforderungsablauf und die Uhr. Geben Sie keine signierten Upload-URLs weiter. | | Upload erfolgreich; public URL gibt 403 zurück | Überprüfen Sie, ob die öffentliche Bereitstellung aktiviert ist und die Bereitstellung der Domäne/Distribution abgeschlossen ist. | | Öffentlich URL gibt 404 zurück | Vergleichen Sie den vollständigen URL mit dem genauen Objektschlüssel. Überprüfen Sie fehlende oder doppelte Ordner und die Groß-/Kleinschreibung von Dateinamen. | | URL öffnet direkt; Der Abruf des Players schlägt fehl | Den Ursprung der Player-Seite zu GET/HEAD CORS hinzufügen. Überprüfen Sie die Antwortheader CDN und machen Sie betroffene veraltete zwischengespeicherte Antworten ungültig. | | Download erfolgreich; Die Wiedergabe schlägt fehl | Überprüfen Sie die Paketveröffentlichung, Manifestpfade, MIME-Typen und DRM-Lizenzautorisierung. Siehe [Fehlerbehebung bei der Wiedergabe](https://docs.drm-x.com/de/troubleshooting/playback). | **CloudFront 403:** Bestätigen Sie, dass OAC Anforderungen signiert, die Bucket-Richtlinie die richtige Verteilung ARN und das richtige Präfix verwendet und der Ursprung der Endpunkt S3 REST ist. Behalten Sie S3 Block Public Access bei. Überprüfen Sie die KMS-Berechtigungen, wenn Sie SSE-KMS ausgewählt haben. ## Offizielle Referenzen[#](#references) - [Erstellen Sie einen S3 Bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-bucket.html) - [Verwalten IAM Zugriffsschlüssel](https://docs.aws.amazon.com/IAM/latest/UserGuide/access-key-self-managed.html) - [S3 CORS Konfiguration](https://docs.aws.amazon.com/AmazonS3/latest/userguide/ManageCorsUsing.html) - [CloudFront OAC und S3 Bucket-Richtlinien](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-restricting-access-to-s3.html) - [CloudFront Antwortheader](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/adding-response-headers.html) - [Verwaltete Ursprungsanforderungsrichtlinien](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/using-managed-origin-request-policies.html) - [Benutzerdefinierte Domänen und Zertifikate](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/add-domain-existing-distribution.html) Cloudflare verwenden? Folgen Sie [Cloudflare R2 Setup](https://docs.drm-x.com/de/storage/cloudflare-r2).