Uso di Axinom per fornire licenze Widevine ai Servizi multimediali di AzureUsing Axinom to deliver Widevine licenses to Azure Media Services

PanoramicaOverview

Servizi multimediali di Azure (AMS) ha aggiunto la protezione dinamica Google Widevine. Per altre informazioni, vedere il blog di Mingfei.Azure Media Services (AMS) has added Google Widevine dynamic protection (see Mingfei’s blog for details). Azure Media Player (AMP) ha aggiunto anche il supporto per Widevine. Per informazioni dettagliate, vedere il documento su AMP.In addition, Azure Media Player (AMP) has also added Widevine support (see AMP document for details). Ciò offre molti vantaggi per lo streaming di contenuto DASH protetto da CENC con DRM multi-native (PlayReady e Widevine) in browser moderni dotati di MSE ed EME.This is a major accomplishment in streaming DASH content protected by CENC with multi-native-DRM (PlayReady and Widevine) on modern browsers equipped with MSE and EME.

A partire da Servizi Multimediali .NET SDK versione 3.5.2, Servizi multimediali consente di configurare il modello di licenza Widevine e ottenere licenze Widevine.Starting with the Media Services .NET SDK version 3.5.2, Media Services enables you to configure Widevine license template and get Widevine licenses. È anche possibile usare i partner AMS seguenti per facilitare la distribuzione di licenze Widevine: Axinom, EZDRM e castLabs.You can also use the following AMS partners to help you deliver Widevine licenses: Axinom, EZDRM, castLabs.

Questo articolo illustra come integrare e testare il server licenze Widevine gestito da Axinom.This article describes how to integrate and test Widevine license server managed by Axinom. In particolare, illustra le operazioni seguenti:Specifically, it covers:

  • Configurazione della Common Encryption dinamica con DRM multiplo (PlayReady e Widevine) con URL di acquisizione licenze corrispondenti.Configuring dynamic Common Encryption with multi-DRM (PlayReady and Widevine) with corresponding license acquisition URLs;
  • Generazione di un token JWT per soddisfare i requisiti del server licenze.Generating a JWT token in order to meet the license server requirements;
  • Sviluppo di un'app Azure Media Player che gestisce l'acquisizione di licenze con l'autenticazione con token JWT.Developing Azure Media Player app which handles license acquisition with JWT token authentication;

Il sistema completo e il flusso di chiavi simmetriche, ID della chiave, semi chiave, token JTW e relative attestazioni può essere descritto in modo ottimale tramite il diagramma seguente.The complete system and the flow of content key, key ID, key seed, JTW token and its claims can be best described by the following diagram.

DASH e CENC

Protezione del contenutoContent Protection

Per configurare la protezione dinamica e i criteri di distribuzione delle chiavi, vedere il blog di Mingfei relativo a come configurare la creazione di pacchetti Widevine con Servizi multimediali di Azure.For configuring dynamic protection and key delivery policy, please see Mingfei’s blog: How to configure Widevine packaging with Azure Media Services.

È possibile configurare la protezione CENC dinamica con DRM multiplo per lo streaming DASH in modo che includa gli elementi seguenti:You can configure dynamic CENC protection with multi-DRM for DASH streaming having both of the following:

  1. Protezione PlayReady per Microsoft Edge e IE11, che potrebbero presentare restrizioni relative all'autorizzazione con token.PlayReady protection for MS Edge and IE11, that could have a token authorization restrictions. I criteri con restrizione token devono essere associati a un token emesso da un servizio token di sicurezza, ad esempio Azure Active Directory.The token restricted policy must be accompanied by a token issued by a Secure Token Service (STS), such as Azure Active Directory;
  2. Protezione Widevine per Chrome. Può richiedere l'autenticazione con token tramite token emessi da un altro servizio token di sicurezza.Widevine protection for Chrome, it can require token authentication with token issued by another STS.

Per informazioni sui motivi per cui non è possibile usare Azure Active Directory come servizio token di sicurezza per il server licenze Widevine di Axinom, vedere Generazione di token JWT .Please see JWT Token Generation section for why Azure Active Directory cannot be used as an STS for Axinom’s Widevine license server.

ConsiderazioniConsiderations

  1. È necessario usare il seme chiave specificato da Axinom (8888000000000000000000000000000000000000) e l'ID chiave generato o selezionato per generare la chiave simmetrica per la configurazione del servizio di distribuzione delle chiavi.You must use the Axinom specified key seed (8888000000000000000000000000000000000000) and your generated or selected key ID to generate the content key for configuring key delivery service. Il server licenze Axinom emetterà tutte le licenze contenenti chiavi simmetriche basate sullo stesso seme chiave, valido per il test e la produzione.Axinom license server will issue all licenses containing content keys based on the same key seed, which is valid for both testing and production.
  2. URL di acquisizione di licenze Widevine per i test: https://drm-widevine-licensing.axtest.net/AcquireLicense.The Widevine license acquisition URL for testing: https://drm-widevine-licensing.axtest.net/AcquireLicense. Sono consentiti sia HTTP che HTTS.Both HTTP and HTTS are allowed.

Preparazione di Azure Media PlayerAzure Media Player Preparation

Azure Media Player v1.4.0 supporta la riproduzione di contenuto AMS incluso dinamicamente in pacchetti con PlayReady e Widevine DRM.AMP v1.4.0 supports playback of AMS content that is dynamically packaged with both PlayReady and Widevine DRM. Se il server licenze Widevine non richiede l'autenticazione tramite token, non sono necessarie altre operazioni per testare un contenuto DASH protetto da Widevine.If Widevine license server does not require token authentication, there is nothing additional you need to do to test a DASH content protected by Widevine. Per un esempio, il team AMP fornisce un semplice esempio, dove è possibile vederlo funzionante nel bordo e in IE11 con PlayReady e Chrome con Widevine.For an example, the AMP team provides a simple sample, where you can see it working in Edge and IE11 with PlayReady and Chrome with Widevine. Il server licenze Widevine fornito da Axinom richiede l'autenticazione tramite token JWT.The Widevine license server provided by Axinom requires JWT token authentication. Il token JWT deve essere inviato con la richiesta di licenza tramite un'intestazione HTTP "X-AxDRM-Message".The JWT token needs to be submitted with license request through an HTTP header “X-AxDRM-Message”. Per questo scopo è necessario aggiungere il codice javascript seguente nella pagina Web che ospita AMP prima di configurare l'origine:For this purpose, you need to add the following javascript in the web page hosting AMP before setting the source:

<script>AzureHtml5JS.KeySystem.WidevineCustomAuthorizationHeader = "X-AxDRM-Message"</script>

Il resto del codice di Azure Media Player è un'API di Azure Media Player standard, come illustrato in questodocumento su Azure Media Player.The rest of AMP code is standard AMP API as in AMP document here.

Si noti che il codice javascript precedente per la configurazione dell'intestazione di autorizzazione personalizzata costituisce ancora un approccio a breve termine, prima del rilascio dell'approccio ufficiale a lungo termine in Azure Media Player.Note that the above javascript for setting custom authorization header is still a short term approach before the official long term approach in AMP is released.

Generazione di token JWTJWT Token Generation

Il server licenze Axinom Widevine per il test richiede l'autenticazione tramite token JWT.Axinom Widevine license server for testing requires JWT token authentication. Una delle attestazioni nel token JWT, inoltre, è di tipo oggetto complesso, invece di tipo di dati primitivi.In addition, one of the claims in the JWT token is of a complex object type instead of primitive data type.

Sfortunatamente, Azure AD può emettere solo token JWT con tipi primitivi.Unfortunately, Azure AD can only issue JWT tokens with primitive types. Analogamente, l'API .NET Framework (System.IdentityModel.Tokens.SecurityTokenHandler e JwtPayload) consente solo di inserire tipi di oggetto complessi come attestazioni.Similarly, .NET Framework API (System.IdentityModel.Tokens.SecurityTokenHandler and JwtPayload) only allows you to input complex object type as claims. Le attestazioni vengono tuttavia serializzate comunque come stringa.However, the claims are still serialized as string. Non è quindi possibile usarle per generare il token JWT per la richiesta di licenza Widevine.Therefore we cannot use any of the two for generating the JWT token for Widevine license request.

Il pacchetto NuGet JWT di John Sheehan soddisfa le esigenze specifiche, quindi verrà usato.John Sheehan’s JWT Nuget package meets the needs so we are going to use this Nuget package.

Il codice seguente consente di generare il token JWT con le attestazioni necessarie, in base a quanto richiesto dal server licenze Axinom Widevine per i test:Below is the code for generating JWT token with the needed claims as required by Axinom Widevine license server for testing:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.IdentityModel.Tokens;
using System.IdentityModel.Protocols.WSTrust;
using System.Security.Claims;

namespace OpenIdConnectWeb.Utils
{
    public class JwtUtils
    {
        //using John Sheehan's NuGet JWT library: https://www.nuget.org/packages/JWT/
        public static string CreateJwtSheehan(string symmetricKeyHex, string key_id)
        {
            byte[] symmetricKey = ConvertHexStringToByteArray(symmetricKeyHex);  //hex string to byte[] Note: Note that the key is a hex string, however it must be treated as a series of bytes not a string when encoding.

            var payload = new Dictionary<string, object>()
                         {
                             { "version", 1 },
                             { "com_key_id", System.Configuration.ConfigurationManager.AppSettings["ax:com_key_id"] },
                             { "message", new { type = "entitlement_message", key_ids = new string[] { key_id } }  }
                         };

            string token = JWT.JsonWebToken.Encode(payload, symmetricKey, JWT.JwtHashAlgorithm.HS256);

            return token;
        }

        //convert hex string to byte[]
        public static byte[] ConvertHexStringToByteArray(string hexString)
        {
            if (hexString.Length % 2 != 0)
            {
                throw new ArgumentException(String.Format(System.Globalization.CultureInfo.InvariantCulture, "The binary key cannot have an odd number of digits: {0}", hexString));
            }

            byte[] HexAsBytes = new byte[hexString.Length / 2];
            for (int index = 0; index < HexAsBytes.Length; index++)
            {
                string byteValue = hexString.Substring(index * 2, 2);
                HexAsBytes[index] = byte.Parse(byteValue, System.Globalization.NumberStyles.HexNumber, System.Globalization.CultureInfo.InvariantCulture);
            }

            return HexAsBytes;
        }

    }  

}  

Server licenze Axinom WidevineAxinom Widevine license server

<add key="ax:laurl" value="http://drm-widevine-licensing.axtest.net/AcquireLicense" />
<add key="ax:com_key_id" value="69e54088-e9e0-4530-8c1a-1eb6dcd0d14e" />
<add key="ax:com_key" value="4861292d027e269791093327e62ceefdbea489a4c7e5a4974cc904b840fd7c0f" />
<add key="ax:keyseed" value="8888000000000000000000000000000000000000" />

ConsiderazioniConsiderations

  1. Anche se il servizio di distribuzione licenze PlayReady dei Servizi multimediali di Azure richiede il prefisso "Bearer=" per il token di autenticazione, il server licenze Axinom Widevine non lo usa.Even though AMS PlayReady license delivery service requires “Bearer=” preceding an authentication token, Axinom Widevine license server does not use it.
  2. La chiave di comunicazione Axinom viene usata come chiave di firma.The Axinom communication key is used as signing key. Si noti che la chiave è una stringa esadecimale, ma deve essere considerata come una serie di byte, non una stringa, durante la codifica.Note that the key is a hex string, however it must be treated as a series of bytes not a string when encoding. Questo risultato viene ottenuto tramite il metodo ConvertHexStringToByteArray.This is achieved by the method ConvertHexStringToByteArray.

Recupero dell'ID chiaveRetrieving Key ID

Come si può notare, l'ID chiave è necessario nel codice per la generazione di un token JWT.You may have noticed that in the code for generating a JWT token, key ID is required. Poiché il token JWT deve essere pronto prima di caricare il lettore di Azure Media Player, è necessario recuperare l'ID chiave per generare il token JWT.Since the JWT token needs to be ready before loading AMP player, key ID needs to be retrieved in order to generate JWT token.

È ovviamente possibile ottenere l'ID chiave in molti modi.Of course there are multiple ways to get hold of key ID. Ad esempio, è possibile archiviare l'ID chiave insieme ai metadati dei contenuti in un database.For example, one may store key ID together with content metadata in a database. In alternativa, è possibile recuperare l'ID chiave dal file DASH MPD (Media Presentation Description),Or you can retrieve key ID from DASH MPD (Media Presentation Description) file. usando il codice seguente.The code below is for the latter.

//get key_id from DASH MPD
public static string GetKeyID(string dashUrl)
{
    if (!dashUrl.EndsWith("(format=mpd-time-csf)"))
    {
        dashUrl += "(format=mpd-time-csf)";
    }

    XPathDocument objXPathDocument = new XPathDocument(dashUrl);
    XPathNavigator objXPathNavigator = objXPathDocument.CreateNavigator();
    XmlNamespaceManager objXmlNamespaceManager = new XmlNamespaceManager(objXPathNavigator.NameTable);
    objXmlNamespaceManager.AddNamespace("",     "urn:mpeg:dash:schema:mpd:2011");
    objXmlNamespaceManager.AddNamespace("ns1",  "urn:mpeg:dash:schema:mpd:2011");
    objXmlNamespaceManager.AddNamespace("cenc", "urn:mpeg:cenc:2013");
    objXmlNamespaceManager.AddNamespace("ms",   "urn:microsoft");
    objXmlNamespaceManager.AddNamespace("mspr", "urn:microsoft:playready");
    objXmlNamespaceManager.AddNamespace("xsi",  "http://www.w3.org/2001/XMLSchema-instance");
    objXmlNamespaceManager.PushScope();

    XPathNodeIterator objXPathNodeIterator;
    objXPathNodeIterator = objXPathNavigator.Select("//ns1:MPD/ns1:Period/ns1:AdaptationSet/ns1:ContentProtection[@value='cenc']", objXmlNamespaceManager);

    string key_id = string.Empty;
    if (objXPathNodeIterator.MoveNext())
    {
        key_id = objXPathNodeIterator.Current.GetAttribute("default_KID", "urn:mpeg:cenc:2013");
    }

    return key_id;
}

RiepilogoSummary

La recente aggiunta del supporto per Widevine nella protezione del contenuto di Servizi multimediali di Azure e in Azure Media Player consente di implementare lo streaming di DASH + DRM multi-native (PlayReady + Widevine) con il server licenze PlayReady nei Servizi multimediali di Azure e un server licenze Widevine di Axinom per i browser moderni seguenti:With latest addition of Widevine support in both Azure Media Services Content Protection and Azure Media Player, we are able to implement streaming of DASH + Multi-native-DRM (PlayReady + Widevine) with both PlayReady license service in AMS and Widevine license server from Axinom for the following modern browsers:

  • ChromeChrome
  • Microsoft Edge in Windows 10Microsoft Edge on Windows 10
  • IE 11 in Windows 8.1 e Windows 10IE 11 on Windows 8.1 and Windows 10
  • Anche Firefox (Desktop) e Safari on Mac (non iOS) sono supportati tramite Silverlight e lo stesso URL con Azure Media PlayerBoth Firefox (Desktop) and Safari on Mac (not iOS) are also supported via Silverlight and the same URL with Azure Media Player

I parametri seguenti sono necessari nella soluzione minima che sfrutta il server licenze Axinom Widevine.The following parameters are required in the mini-solution leveraging Axinom Widevine license server. Ad eccezione dell'ID chiave, il resto dei parametri viene fornito da Axinom in base alla configurazione del server Widevine.Except for key ID, the rest of parameters are provided by Axinom based on their Widevine server setup.

ParametroParameter Modalità di utilizzoHow it is used
ID chiave di comunicazioneCommunication key ID Deve essere incluso come valore di attestazione "com_key_id" nel token JWT. Vedere questa sezione.Must be included as value of the claim "com_key_id" in JWT token (see this section).
Chiave di comunicazioneCommunication key Deve essere utilizzato come chiave di firma di token JWT (vedere questa sezione).Must be used as the signing key of JWT token (see this section).
Seme chiaveKey seed Deve essere usato per generare la chiave simmetrica con qualsiasi ID della chiave simmetrica. Vedere questa sezione.Must be used to generate content key with any given content key ID (see this section).
L'URL di acquisizione della licenza Widevine.Widevine License acquisition URL È necessario usare la configurazione dei criteri di recapito asset per il flusso DASH. Vedere questa sezione.Must be used in configuring asset delivery policy for DASH streaming (see this section ).
ID della chiave del contenutoContent Key ID Deve essere incluso come parte del valore del reclamo del messaggio di attestazione del diritto di token JWT (vedere questa sezione).Must be included as part of the value of Entitlement Message claim of JWT token (see this section).

Percorsi di apprendimento di Servizi multimedialiMedia Services learning paths

Altre informazioni sui percorsi di apprendimento di Servizi multimediali di Azure:Read about the Azure Media Services learning paths:

Fornire commenti e suggerimentiProvide feedback

Usare il forum di suggerimenti degli utenti per fornire commenti e suggerimenti su come migliorare Servizi multimediali di Azure.Use the User Voice forum to provide feedback and make suggestions on how to improve Azure Media Services. È anche possibile passare direttamente a una delle categorie seguenti:You also can go directly to one of the following categories:

RingraziamentiAcknowledgments

Microsoft è lieta di conferire un riconoscimento alle persone seguenti che hanno contribuito alla realizzazione di questo documento: Kristjan Jõgi di Axinom, Mingfei Yan e Amit Rajput.We would like to acknowledge the following people who contributed towards creating this document: Kristjan Jõgi of Axinom, Mingfei Yan, and Amit Rajput.