DRM-X 6.0 logo de la colombe et de la branche d'oliveDRM-X 6.0Documentation
◎ Français

Amazon S3 et CloudFront : pas à pas

Connectez un bucket S3 privé à DRM-X 6.0 avec des autorisations IAM restreintes, CORS pour le navigateur, une diffusion HTTPS via CloudFront et une procédure de vérification des envois.

Voir le MarkdownExemples en ligneMis à jour le 2026-09-28
Du bucket privé à la diffusion publique de médias chiffrés Créez un bucket S3, donnez à DRM-X des identifiants d’envoi à portée limitée, configurez CORS, connectez CloudFront, puis envoyez et récupérez un objet de test. Conservez les originaux et fichiers privés ailleurs.

1. Comprendre la connexion#

DRM-X envoie directement les fichiers vers S3 avec des requêtes signées. Les spectateurs téléchargent les médias chiffrés via CloudFront en HTTPS. Gardez Block all public access activé sur S3 ; CloudFront reçoit un accès en lecture limité par Origin Access Control (OAC).

CloudFront fournit un domaine https://….cloudfront.net utilisable en production. Votre propre domaine est facultatif. La diffusion publique rend les octets accessibles ; DRM contrôle toujours le déchiffrement du média correctement préparé. CORS ne constitue pas une autorisation. Ce guide utilise une diffusion CDN publique ordinaire. Les URL ou cookies signés pour les spectateurs nécessitent une intégration distincte.

2. Créez votre bucket S3#

AWS S3 formulaire de création : General purpose, Global namespace et un exemple de nom de bucket.
1 : choisissez General purpose. 2 : entrez votre propre nom unique. Il s'agit d'un véritable formulaire console avec un exemple non soumis ; les en-têtes de compte sont exclus.
  1. Ouvrez Amazon S3 → General purpose buckets → Create bucket.
  2. Sélectionnez une région et enregistrez son code, tel que us-east-1. Choisissez General purpose. Si un espace de noms vous est demandé, utilisez Global namespace pour cette procédure pas à pas.
  3. Entrez votre propre nom de bucket unique au monde. Gardez Object Ownership → ACLs disabled (Bucket owner enforced).
  4. Gardez Block all public access coché. Vous accorderez un accès CloudFront via une politique limitée.
  5. Pour ce guide, conservez Default encryption → Server-side encryption with Amazon S3 managed keys (SSE-S3). Ce chiffrement du stockage complète le packaging DRM sans le remplacer. SSE-KMS exige des autorisations KMS supplémentaires pour l’émetteur des fichiers et pour CloudFront.
  6. Vérifiez et créez le bucket. N'activez pas l'hébergement de site Web statique S3.

3. Créez un utilisateur IAM à droits limités et une clé d’accès#

  1. Ouvrez IAM → Policies → Create policy → JSON. Collez la stratégie ci-dessous, en remplaçant l'exemple de nom de bucket partout.
  2. L'exemple autorise uniquement protected/. Si vous utilisez un autre chemin de base, mettez à jour la condition de préfixe et l'objet ARN. Pour une utilisation à la racine du bucket, supprimez la condition de préfixe ListBucket et utilisez arn:aws:s3:::YOUR_BUCKET/* pour les objets.
  3. Enregistrez la stratégie. Ouvrez IAM → Users → Create user, créez un utilisateur d'intégration dédié sans accès AWS Console et attachez uniquement cette stratégie.
  4. Ouvrez le Security credentials → Access keys → Create access key de l'utilisateur. Choisissez le cas d'utilisation d'une application exécutée en dehors de AWS et suivez les invites. Conservez soigneusement les Access key ID et Secret access key pour DRM-X.
{
  "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/*"
    }
  ]
}

N’utilisez ni les clés du compte root ni AdministratorAccess. La copie utilise GetObject et PutObject : il n’existe pas d’action IAM s3:CopyObject distincte. Le renommage nécessite aussi DeleteObject. Le formulaire DRM-X actuel attend une paire de clés d’accès ; un ARN de rôle seul ne la remplace pas.

4. Configurez CORS sur S3 pour les envois depuis le navigateur#

  1. Ouvrez votre bucket S3 → Permissions.
  2. Accédez à Cross-origin resource sharing (CORS) → Edit.
  3. Collez le JSON ci-dessous. Utilisez * pour lire les médias chiffrés publics et limitez les envois à DRM-X Console. Conservez les autres règles nécessaires des buckets existants.
  4. Sélectionnez Save changes. Gardez Block Public Access activé : CORS ne rend pas le bucket public.
[
  {
    "AllowedOrigins": [
      "https://6.drm-x.com"
    ],
    "AllowedMethods": [
      "PUT"
    ],
    "AllowedHeaders": [
      "Content-Type",
      "x-amz-meta-drmx-sha256"
    ],
    "ExposeHeaders": [
      "ETag"
    ],
    "MaxAgeSeconds": 3600
  },
  {
    "AllowedOrigins": [
      "*"
    ],
    "AllowedMethods": [
      "GET",
      "HEAD"
    ],
    "AllowedHeaders": [
      "Range"
    ],
    "ExposeHeaders": [
      "ETag",
      "Content-Length",
      "Content-Range",
      "Accept-Ranges"
    ],
    "MaxAgeSeconds": 3600
  }
]

Configurez les envois signés sur S3 et le CORS de lecture sur S3 et CloudFront. À l’étape 5, utilisez les mêmes origines de lecture dans la politique d’en-têtes de réponse CloudFront.

5. Créez votre URL de diffusion HTTPS avec CloudFront#

  1. Ouvrez CloudFront → Distributions → Create distribution. Utilisez une distribution standard. Si AWS affiche une sélection de plan d'intégration ou de tarification, examinez et choisissez le plan approprié à votre compte avant de créer des ressources.
  2. Sélectionnez le S3 REST origin normal du bucket, et non son point de terminaison de site Web. Laissez Origin path vide pour le mappage de dossiers utilisé dans ce guide.
  3. Choisissez Origin access control settings (recommended). Créez ou sélectionnez un OAC avec Sign requests (recommended).
  4. Définissez la politique de protocole de la visionneuse sur Redirect HTTP to HTTPS ou HTTPS only. Autoriser GET, HEAD, OPTIONS. Les envois utilisent le point de terminaison S3, donc CloudFront n'a pas besoin de PUT.
  5. Créez la distribution. Appliquez la stratégie de bucket générée par CloudFront sous S3 → bucket → Permissions → Bucket policy → Modifier. Fusionner avec les instructions existantes requises. Restreindre l'accès au ARN de cette distribution. L'exemple ci-dessous limite la lecture à protected/.
  6. Ouvrez CloudFront → Policies → Response headers → Create response headers policy. Configurez les champs CORS dans le tableau ci-dessous. Attachez cette stratégie au comportement média/par défaut de la distribution.
  7. Attendez la fin du déploiement. Copiez Distribution domain name. Votre origine de diffusion est le https://YOUR_DISTRIBUTION.cloudfront.net.
Champ de la politique Response headersValeur
Access-Control-Allow-Origin* (recommandé pour les médias chiffrés publics). Si vous choisissez des origines précises dans le générateur, utilisez ici la même liste.
Access-Control-Allow-MethodsGET, HEAD, OPTIONS
Access-Control-Allow-HeadersRange
Access-Control-Expose-HeadersETag, Content-Length, Content-Range, Accept-Ranges
Access-Control-Allow-CredentialsDésactivé pour ce workflow multimédia chiffré public.
Access-Control-Max-Age3600
Origin overrideActivé pour que CloudFront contrôle de manière cohérente CORS orienté vers le spectateur.

Pour le contrôle en amont OPTIONS, joignez la stratégie de demande d'origine gérée CORS-S3Origin. Il transmet Origin, Access-Control-Request-Method et Access-Control-Request-Headers vers S3. Initialement, mettez en cache GET/HEAD uniquement, en laissant la mise en cache OPTIONS désactivée. Si vous mettez ultérieurement en cache OPTIONS, incluez ces en-têtes dans sa clé de cache et testez différentes origines de lecteurs ; le transfert d'un en-tête seul ne l'ajoute pas à la clé de cache.

{
  "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"
        }
      }
    }
  ]
}

Remplacez l'exemple de compte ID, la distribution ID et le nom du bucket. Le SourceArn doit identifier la distribution que vous venez de créer. Après les modifications d’en-tête, invalidez les chemins de test/média concernés si les réponses antérieures restent en cache.

Facultatif : utilisez media.example.com

  1. Demandez un certificat public ACM couvrant votre nom d'hôte en US East (N. Virginia), us-east-1 et complétez la validation DNS.
  2. Ajoutez le nom d'hôte sous le Alternate domain names de la distribution et joignez son certificat.
  3. Chez votre fournisseur DNS, créez le CNAME ou l'alias pris en charge pointant vers le nom d'hôte CloudFront. Attendez le DNS, le déploiement du certificat et de la distribution.
  4. Utilisez https://media.example.com comme origine de diffusion. Un DNS CNAME seul est insuffisant sans la configuration du domaine et du certificat CloudFront.

6. Connectez Amazon S3 à DRM-X 6.0#

Ouvrez Cloud Storage → Connect storage. Choisissez Amazon S3.

ChampQue saisir
Display nameUn libellé explicite, par exemple Production S3.
Bucket nameLe nom exact, sans s3://.
RegionLe code régional exact AWS du bucket.
Protected-content base pathprotected, correspondant aux IAM et aux stratégies de bucket.
Public URL prefixhttps://YOUR_DISTRIBUTION.cloudfront.net/protected ou https://media.example.com/protected.
Access key ID / Secret access keyLa bi-clé dédiée de l'utilisateur IAM.

Les exemples utilisent un dossier appelé protected. Le nom du bucket n'est pas automatiquement un dossier. Avec le mappage direct domaine-bucket utilisé ici, incluez le même dossier de stockage exactement une fois dans le préfixe public URL.

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

Pour utiliser la racine du bucket, laissez le chemin de base vide et entrez uniquement l'origine de la diffusion comme préfixe public. N'ajoutez pas de nom de bucket, sauf si vous l'utilisez délibérément comme dossier. Laissez CloudFront Origin path vide pour ce mappage.

Sélectionnez la destination de envoi par défaut si vous le souhaitez, puis Save and verify. Le nom d'hôte S3 API n'est pas votre diffusion CloudFront URL.

La politique * autorise les lectures du navigateur depuis tout site ; l’autorisation de licence DRM contrôle toujours le déchiffrement. Utilisez un bucket dédié aux médias chiffrés et aux ressources destinées à être publiques. Les requêtes de médias doivent omettre les cookies interorigines ; une diffusion authentifiée par cookies nécessite une configuration CORS distincte.

Générez vos champs CORS et URL correspondants

Cet outil s'exécute dans votre navigateur. Entrez uniquement les origines publiques ; il ne demande pas de clés d'accès.

Utilisez * pour la lecture depuis tout site (recommandé). Pour restreindre les origines, saisissez des origines HTTPS séparées par des espaces ou des virgules, sans chemin de page. DRM-X Console et Playback Lab sont inclus automatiquement.Saisissez votre domaine personnalisé connecté ou votre origine CloudFront. N’incluez pas le dossier ici.

7. Envoyez un fichier et vérifiez le résultat#

  1. Ouvrez Cloud Storage, sélectionnez cette destination, puis Verify location. Un résultat positif prouve seulement que le serveur DRM-X peut lister le bucket. Il ne valide pas les droits d’écriture, CORS dans le navigateur ni la diffusion publique.
  2. Sélectionnez Upload encrypted files, puis un petit segment chiffré d’un package DRM-X existant. Si vous n’en avez pas, utilisez le fichier de diagnostic chiffré ci-dessous. N’envoyez ni vidéo originale ni document personnel.
  3. Attendez le message de réussite. Vérifiez que le nom du fichier et sa taille apparaissent dans Cloud Storage. Recherchez le même objet sous protected/ dans la console de votre fournisseur.
  4. Ouvrez Preview URL dans une fenêtre de navigation privée. Vérifiez que l’objet téléversé renvoie HTTP 200 sans connexion à un compte.
  5. Vérifiez les réponses du manifeste et des médias dans le panneau Network du navigateur. Avec la politique par défaut, Access-Control-Allow-Origin doit être * ; avec une politique restreinte, il doit correspondre exactement à l’origine du lecteur. Ouvrir directement une URL ne teste pas CORS.
  6. À la fin, supprimez uniquement votre objet de diagnostic temporaire. Suivez ensuite le guide Desktop Packager, choisissez cette destination dans Package content et envoyez le package chiffré complet. Un envoi manuel de fichier ne crée pas de Published Content ID.
  7. Testez le fichier Published résultant dans Universal Playback Lab et votre propre site Web de lecteur. Vérifiez la vidéo, l'audio, la navigation dans la vidéo et vos appareils requis. Un téléchargement binaire réussi ne constitue pas une preuve de lecture DRM.
Aucun exemple chiffré ? Créez un fichier de test jetable sur Windows

Exécutez ceci dans Windows PowerShell dans un dossier temporaire que vous contrôlez. Il crypte un court message non personnel avec une clé à usage unique AES conservée uniquement en mémoire. Le résultat est un diagnostic de stockage, et non un support lisible ; il ne contient aucune clé de contenu DRM ni aucune donnée client.

$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

Envoyez drmx-storage-check.encrypted.bin, vérifiez sa taille et Preview URL, puis supprimez-le du bucket.

curl.exe -I -H "Origin: https://www.example.com" "https://media.example.com/protected/sample.encrypted.bin"

Remplacez les deux URL. Avec la politique par défaut, attendez HTTP 200 et Access-Control-Allow-Origin: *. Une requête GET avec Range: bytes=0-15 doit renvoyer HTTP 206 et Content-Range. Conservez les types MIME : application/dash+xml pour DASH, application/vnd.apple.mpegurl pour HLS et le type approprié pour les fichiers multimédias.

8. Dépannez votre résultat#

RésultatAction
La vérification réussit, mais l’envoi depuis le navigateur échoueExaminez les panneaux Console et Network du navigateur. Autorisez PUT via CORS depuis l’origine exacte de Console, ainsi que Content-Type. Vérifiez aussi la connexion, puis réessayez avec une nouvelle URL présignée.
Le envoi renvoie 403Vérifiez l'autorisation d'écriture de l'objet, la portée du bucket/dossier, le point de terminaison, la région, l'expiration de la demande et l'horloge. Ne partagez pas les URL de envoi signées.
Le envoi réussit ; public URL renvoie 403Vérifiez si la diffusion publique est activée et si le domaine/la distribution a terminé son déploiement.
L’URL publique renvoie 404Comparez le URL complet avec la clé d'objet exacte. Vérifiez les dossiers manquants ou en double et la casse du nom de fichier.
URL s'ouvre directement ; la récupération du lecteur échoueVérifiez le CORS GET/HEAD sur l’hôte de diffusion. Utilisez * pour les médias chiffrés publics ou autorisez l’origine exacte du lecteur. Purgez les anciennes réponses du CDN, puis réessayez. Pour S3, vérifiez aussi la politique d’en-têtes de réponse CloudFront.
Fonctionne dans DRM-X Playback Lab ; Moodle ou WordPress affiche Failed to fetchVérifiez le CORS GET/HEAD sur l’hôte de diffusion. Utilisez * pour les médias chiffrés publics ou autorisez l’origine exacte du lecteur. Purgez les anciennes réponses du CDN, puis réessayez. Pour S3, vérifiez aussi la politique d’en-têtes de réponse CloudFront.
Le téléchargement réussit ; la lecture échoueVérifiez la publication du package, les chemins du manifeste, les types MIME et l'autorisation de licence DRM. Voir dépannage de lecture.

CloudFront 403 : confirme que OAC signe les demandes, que la stratégie de bucket utilise la distribution ARN et le préfixe corrects, et que l'origine est le point de terminaison S3 REST. Gardez S3 Block Public Access allumé. Vérifiez les autorisations KMS si vous avez choisi SSE-KMS.

Références officielles#

Pour les autres fournisseurs, consultez le guide de configuration du stockage cloud.