Chiffrement de la Video API Vonage

Le chiffrement OpenTok vous permet de créer des archives OpenTok dans lesquelles les données ne sont jamais stockées à l'état non chiffré.

Vous pouvez sécuriser vos archives OpenTok de la manière suivante :

  • Désactiver le stockage d'archive de secours — Par défaut, Vonage stocke un fichier d'archive sur les serveurs OpenTok s'il n'a pas pu télécharger le fichier vers le serveur Amazon S3 ou Microsoft Azure que vous avez spécifié. Vous pouvez empêcher ce stockage de secours lorsque vous utilisez l'API REST OpenTok pour définir la destination de téléchargement de l'archive.

  • Utilisez le chiffrement OpenTok — Cela vous permet de créer des archives OpenTok dans lesquelles les données ne sont jamais stockées à l'état non chiffré. Cela garantit le plus haut niveau de sécurité.

  • Utiliser le chiffrement côté serveur d'Amazon S3 — Cette option utilise les clés de chiffrement gérées par Amazon S3 pour le chiffrement. Pour plus d'informations, consultez ce guide du développeur.

Grâce au chiffrement OpenTok, les données vidéo et audio contenues dans une archive OpenTok sont chiffrées à l'aide d'un certificat de clé publique que vous fournissez à Vonage.

Important : La fonctionnalité de chiffrement d'OpenTok est disponible sous forme de fonction complémentaire. Contactez nous pour activer cette fonctionnalité pour vos clés de projet OpenTok.

Aperçu des fonctionnalités

La fonctionnalité d'archivage chiffré de la plateforme OpenTok vous permet de créer des archives dans lesquelles les données ne sont jamais stockées à l'état non chiffré.

Commencez par créer une paire de clés RSA (clé publique et clé privée) à utiliser avec vos archives OpenTok. À l’aide d’un appel à l’API REST d’OpenTok, vous partagez le certificat de la clé publique avec Vonage. (Dans le même appel REST, vous envoyez les informations relatives à la destination de téléchargement Amazon S3 ou Microsoft Azure à utiliser pour vos archives. La fonctionnalité d’archivage chiffré nécessite que vous définissiez une destination de téléchargement.) Vous enregistrez la clé privée localement pour votre à usage privé uniquement.

Vonage crypte ensuite chaque archive à l'aide d'un mot de passe généré aléatoirement, le crypte à l'aide du certificat, puis stocke le mot de passe crypté sur nos serveurs. Lorsque l'archive est prête, vous en serez informé via un rappel vers votre serveur, et vous pourrez demander le mot de passe. À aucun moment Vonage ne stocke le mot de passe non chiffré, et Vonage n’a aucun moyen de le déchiffrer (seul le détenteur de la clé privée peut le déchiffrer).

Vous pouvez ensuite déchiffrer le mot de passe à l'aide de la clé privée, puis utiliser ce mot de passe pour déchiffrer l'archive chiffrée. Le fichier d'archive déchiffré est au format MPEG-TS.

Vonage utilise l'algorithme AES-256 pour chiffrer l'archive. Le mot de passe généré est chiffré à l'aide du chiffrement RSA avec remplissage OAEP. Notez que vous ne pouvez utiliser l'archivage chiffré qu'avec des archives composées, et non avec des archives de flux individuelles.

Ce document comprend les sections suivantes :

Création d'un certificat d'archivage crypté

Envoi du certificat d'archivage chiffré à Vonage

Décryptage d'une archive

Désactivation de l'archivage crypté

Problèmes connus

Création d'un certificat d'archivage crypté

Créez un certificat X.509 au format PEM et une clé privée correspondante à utiliser avec vos archives :

openssl req -new -x509 -days 365 -newkey rsa:2048 -out cert.pem -keyout key.pem

(Note : Ceci a été testé avec OpenSSL 1.0.1).

Vous devrez envoyer le certificat à Vonage, qui s'en servira pour générer un mot de passe chiffré, nécessaire au déchiffrement de l'archive. Ce mot de passe peut être déchiffré à l'aide de votre clé privée, et l'archive peut être déchiffrée à l'aide de ce mot de passe. Le mot de passe sera différent pour chaque archive.

La taille de la clé doit être inférieure ou égale à 2 048 bits. Vous devrez envoyer le certificat sous forme de données JSON à l’API REST d’OpenTok pour définir la destination d’archivage (voir la section suivante). Étant donné que le certificat sera inclus dans les données JSON, envoyez les données encodées en base64 ou remplacez les caractères de saut de ligne dans le certificat par « \n ».

L'exemple suivant encode le certificat en base64 :

openssl enc -base64 -in cert.pem -out cert.pem.encoded -A

Une chaîne de certificat codée en base64 ressemble à ceci :

"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0..."

Une chaîne de certificat dont les caractères de retour à la ligne ont été remplacés se présente comme suit :

"-----BEGIN CERTIFICATE-----\n...\n...\n
-----END CERTIFICATE-----"

Envoi du certificat d'archivage crypté à Vonage

Pour configurer le certificat et activer le chiffrement des archives, envoyez une requête HTTP PUT à l'URL suivante : URL :

https://api.opentok.com/v2/project/<apiKey>/archive/storage

Remplacer <apiKey> avec votre clé API du projet OpenTok.

Authentifiez la requête API REST à l'aide d'un en-tête HTTP personnalisé : X-OPENTOK-AUTH. Définissez cette valeur sur un jeton Web JSON (voir la documentation de l'API REST d'OpenTok ) :

X-OPENTOK-AUTH: <JSON_web_token>

Créez le jeton web JSON avec les revendications suivantes :

{
    "iss": "your_api_key",
    "ist": "project",
    "iat": current_timestamp_in_seconds,
    "exp": expire_timestamp_in_seconds,
    "jti": "jwt_nonce"
}
  • Set (jeu de mots) iss à votre clé API OpenTok (qui vous a été fournie dans votre Vonage Account sur la page du projet).

  • Set (jeu de mots) ist à "projet".

  • Set (jeu de mots) iat par rapport à l'horodatage de l'époque Unix actuelle (au moment de la création du jeton), en secondes.

  • Set (jeu de mots) exp jusqu'à l'heure d'expiration du jeton. Pour des raisons de sécurité, nous vous recommandons d' utiliser une heure d'expiration proche de l'heure de création du jeton (par exemple, 3 minutes après sa création) et de créer un nouveau jeton pour chaque appel à l'API REST. La durée d'expiration maximale autorisée est de 5 minutes.

  • Set (jeu de mots) jti à un identifiant unique pour le JWT. Cet identifiant est facultatif. Voir la page Spécification du jeton Web JSON » pour plus de détails.

Utilisez la clé secrète de votre projet OpenTok comme clé secrète JWT et signez-la à l'aide de l'algorithme de chiffrement HMAC-SHA256. (Votre clé secrète API vous est fournie dans votre Video API Account (sur la page « Projet ».)

Par exemple, le code Python suivant crée un jeton pouvant être utilisé dans un appel à l'API REST d'OpenTok :

import jwt # See https://pypi.python.org/pypi/PyJWT
import time
import uuid
print jwt.encode({"iss": "my-OpenTok-project-API-key",
  "iat": int(time.time()),
  "exp": int(time.time()) + 180,
  "ist": "project",
  "jti": str(uuid.uuid4())()},
  'my-OpenTokproject-API-secret',
  algorithm='HS256')

Remplacer my-OpenTok-project-API-key et my-OpenTok-project-API-secret avec la clé API et la clé secrète du projet OpenTok.

Régler le Content-type pour l'appel de l'API REST à application/json:

Content-Type:application/json

Remplacer les caractères de fin de ligne du certificat par des caractères de fin de ligne. "\n", afin que vous puissiez l'utiliser dans la chaîne littérale des données JSON.

Transmettez le certificat de clé publique en tant que propriété des données JSON que vous envoyez lorsque vous appelez la méthode REST permettant de configurer le stockage des archives.

Consultez les sections suivantes.

Configuration de l'archivage crypté pour une cible Amazon S3

Pour spécifier un certificat à clé publique à utiliser avec une cible Amazon S3, définissez les données JSON dans l'appel de l'API REST en respectant le format suivant :

{
    "type": "s3",
    "config": {
        "bucket": "example.com.archive-bucket",
        "secretKey": "BvKwyshsmEATx5mngeloHwgKrYMbP+",
        "accessKey": "AWFS7BAO536E6MXA"
    },
    "fallback": "none",
    "certificate": "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0..."
}

Set (jeu de mots) bucket au nom du compartiment Amazon S3 que vous souhaitez utiliser pour le téléchargement des archives. Définissez le secretKey et accessKey propriétés de la clé secrète et de la clé d'accès Amazon S3 pour ce compartiment.

Définir la propriété fallback à "none" pour empêcher le stockage des fichiers d'archive dans le cloud OpenTok en cas d'échec du téléchargement. Définissez la propriété sur "opentok" pour que l'archive soit disponible dans le tableau de bord OpenTok en cas d'échec du téléchargement.

Définissez la propriété « certificate » sur le certificat de clé publique que Vonage utilisera pour chiffrer l’ archive. Veillez à encoder le certificat en Base64 ou à remplacer les caractères de saut de ligne présents dans le certificat par "\n", afin que vous puissiez l'utiliser dans la chaîne littérale des données JSON.

Configuration de l'archivage crypté pour une cible Microsoft Azure

Pour spécifier un certificat à clé publique à utiliser avec une cible Microsoft Azure, configurez les données JSON dans l'appel à l'API REST de manière à respecter le format suivant :

{
    "type": "azure",
    "config": {
        "accountName":"myAccountname",
        "accountKey":"myAccountKey",
        "container": "containerName"
    },
    "fallback": "none",
    "certificate" : "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0...
}

Définissez le conteneur pour qu'il corresponde au nom de votre conteneur Microsoft Azure. Définissez le accountName et accountKey pour correspondre à vos identifiants de stockage Microsoft Azure.

Régler le fallback à la propriété "none" pour empêcher le stockage des fichiers d'archive dans le cloud OpenTok en cas d'échec du téléchargement. Définissez la propriété sur "opentok" pour que l'archive soit disponible dans le tableau de bord OpenTok en cas d'échec du téléchargement.

Régler le certificate propriété du certificat de clé publique que Vonage utilisera pour chiffrer l' archive. Veillez à encoder le certificat en Base64 ou à remplacer les caractères de saut de ligne présents dans le certificat par "\n", afin que vous puissiez l'utiliser dans la chaîne littérale des données JSON. Une chaîne de certificat encodée en base64 se présente comme suit :

"LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0..."

Réponses de l'API REST

Une réponse avec le code d'état 200 indique un succès.

Une réponse avec un code d'état 400 indique que vous avez inclus des données JSON non valides ou que vous n'avez pas spécifié la destination du téléchargement.

Une réponse avec un code d'état 403 indique que vous avez fourni une clé API ou un secret API de projet OpenTok non valide.

Exemples

L'exemple de ligne de commande suivant permet de configurer en toute sécurité le certificat que Vonage doit utiliser pour chiffrer les archives à télécharger vers un compartiment Amazon S3 :

api_key=12345 data='{"type":"s3","config":{"bucket":"your-s3-bucket","secretKey":"your-s3-secret-key","accessKey":"your-s3-access-key"},"certificate" : "...your-cert..."}' curl \ -i \ -H "Content-Type: application/json" \ -X PUT -H "X-OPENTOK-AUTH:$json_web_token" -d '$data' \ https://api.opentok.com/v2/project/$api_key/archive/storage

Définir la valeur de api_key à la clé API de votre projet OpenTok. Définissez la valeur de json_web_token vers un jeton Web JSON.

Définissez les valeurs pour your-s3-bucket et your-s3-access-key pour qu'elles correspondent à vos identifiants Amazon S3. Remplacez la valeur du certificat par la chaîne de caractères du certificat.

L'exemple de ligne de commande suivant permet de configurer en toute sécurité le certificat que Vonage doit utiliser lors du chiffrement des archives à télécharger vers un compartiment Microsoft Azure :

api_key=12345 data='{"type":"azure","config":{"accountName":"your-azure-account-name","accountKey":"your-azure-account-key", "container":"your-azure-container"}, "certificate": "...your-cert..."}' curl \ -i \ -H "Content-Type:application/json" \ -X PUT -H "X-OPENTOK-AUTH:$json_web_token" -d "$data" \ https://api.opentok.com/v2/project/$api_key/archive/storage

Définir la valeur de api_key à la clé API de votre projet OpenTok. Définissez la valeur de json_web_token vers un jeton Web JSON.

Définissez les valeurs pour your-azure-account-name, your-azure-account-name, et your-azure-container pour qu'elles correspondent à vos identifiants Amazon S3. Remplacez la valeur du certificat par la chaîne de caractères du certificat.

Décryptage d'une archive

Vous pouvez configurer une notification de statut d'archivage via le tableau de bord OpenTok. Reportez-vous à la section « Modifications du statut d'archivage » dans le Guide du développeur OpenTok Archiving.

Une fois l'archive créée, les requêtes POST relatives à l'état de l'archive envoyées à votre URL de rappel incluent une propriété « password » :

{
    "id" : "b40ef09b-3811-4726-b508-e41a0f96c68f",
    "event": "archive",
    "createdAt" : 1384221380000,
    "duration" : 328,
    "name" : "Foo",
    "partnerId" : 123456,
    "reason" : "",
    "sessionId" : "2_MX40NzIwMzJ-flR1ZSBPERUIDIwMTN-MC45NDQ2MzE2NH4",
    "size" : 18023312,
    "status" : "uploaded",
    "password" : "e42c...d23"
}

Le mot de passe est constitué d'une clé AES chiffrée par certificat et d'un vecteur d'initialisation, sous la forme de données binaires encodées en Base64.

Les trois premiers octets des données binaires représentent la version (un octet), l'algorithme (un octet) et le mode (un octet). Dans cette version, la longueur est définie sur 1, l'algorithme est défini sur 1 (ce qui correspond à AES-256) et le mode est défini sur 1 (ce qui correspond à CBC).

Les 32 octets suivants constituent la clé. Les 16 octets restants constituent le vecteur d'initialisation.

Commencez par décoder le mot de passe, puis décryptez-le à l'aide de votre clé privée :

openssl enc -base64 -d -A <<< "password-from-tokbox" \ -out password.enc openssl rsautl -decrypt -oaep -inkey key.pem \ -in password.enc -out password.bin

Utilisez ensuite le mot de passe pour décrypter le fichier d'archive :

openssl enc -d -aes-256-cbc -nopad -in your_archive_file.ts \ -out your_decrypted_file.ts \ -K $(xxd -s 3 -l 32 -c 32 -p password.bin) \ -iv $(xxd -s 35 -l 16 -c 16 -p password.bin)

-K c'est la clé

-iv est le vecteur d'initialisation

xxd convertit le mot de passe, une fois décodé en binaire et déchiffré, au format hexadécimal afin qu'il puisse être transmis à OpenSSL. Consultez la page de manuel de xxd pour plus d'informations sur les options.

Désactivation de l'archivage crypté

Pour désactiver l'archivage chiffré, envoyez une requête HTTP PUT à l'URL du stockage d'archives (voir Envoi du certificat d'archivage chiffré à Vonage), mais définissez le certificat sur « null » dans les données JSON que vous envoyez avec la requête.

Désactiver l'archivage crypté pour une cible Amazon S3

Pour supprimer un certificat de clé publique associé à une destination d'archivage Amazon S3 (et désactiver le chiffrement des archives), appelez l'API REST en fournissant les données JSON suivantes :

{
    "type": "s3",
    "config": {
        "bucket": "example.com.archive-bucket",
        "secretKey": "BvKwyshsmEATx5mngeloHwgKrYMbP+",
        "accessKey": "AWFS7BAO536E6MXA"
    },
    "fallback": "none",
    "certificate" : null
}

Set (jeu de mots) bucket au nom du compartiment Amazon S3 que vous souhaitez utiliser pour le téléchargement des archives. Définissez le secretKey et accessKey propriétés de la clé secrète et de la clé d'accès Amazon S3 pour ce compartiment.

Régler le fallback propriété to "none" pour empêcher le stockage des fichiers d'archive dans le cloud OpenTok en cas d'échec du téléchargement. Définissez la propriété sur "opentok" pour que l'archive soit disponible dans le tableau de bord OpenTok en cas d'échec du téléchargement.

Régler le certificate à null.

Désactiver l'archivage crypté pour une cible Microsoft Azure

Pour supprimer le certificat de clé publique d'une cible d'archivage Microsoft Azure (et désactiver le chiffrement des archives), appelez l'API REST avec les données JSON suivantes :

{
    "type": "azure",
    "config": {
        "accountName":"myAccountname",
        "accountKey":"myAccountKey",
        "container": "containerName"
    },
    "certificate" : null
}

Set (jeu de mots) container pour qu'il corresponde au nom de votre conteneur Microsoft Azure. Définissez le accountName et accountKey pour qu'elles correspondent à vos identifiants de stockage Microsoft Azure. Définissez les fallback à la propriété "none" pour empêcher le stockage des fichiers d'archive dans le cloud OpenTok en cas d'échec du téléchargement. Définissez la propriété sur "opentok" pour que l'archive soit disponible dans le tableau de bord OpenTok en cas d'échec du téléchargement. Définissez le certificate à la propriété null.

Réponses de l'API REST

Une réponse avec le code d'état 200 indique que la désactivation du chiffrement a réussi.

Une réponse avec un code d'état 400 indique que vous avez inclus des données JSON non valides ou que vous n'avez pas spécifié la destination du téléchargement.

Une réponse avec un code d'état 403 indique que vous avez fourni une clé API de projet OpenTok ou un secret de partenaire non valide.

Exemple

L'exemple de ligne de commande suivant désactive l'archivage chiffré pour une cible S3 :

api_key=12345 data='"type": "s3","config": {"bucket": "your-s3-bucket","secretKey": "your-s3-secret-key","accessKey": "your-s3-access-key"},{"certificate" : null}' curl \ -i \ -H "Content-Type:application/json" \ -X PUT -H "X-OPENTOK-AUTH:$json_web_token" -d "$data" \ https://api.opentok.com/v2/project/$api_key/archive/storage

Définir la valeur de api_key à votre clé API OpenTok. Définissez la valeur de json_web_token en un jeton Web JSON. Définissez les valeurs pour your-s3-bucket et your-s3-access-key pour correspondre à vos identifiants Amazon S3.

Problème connu

La durée d'une archive chiffrée est toujours indiquée comme étant égale à 0, dans tous les appels à l'API REST OpenTok, dans les méthodes des SDK serveur OpenTok, ainsi que dans les rappels de changement d'état des archives.