Secure Packager and Encoder Key Exchange (SPEKE) is part of the AWS Elemental content encryption protection strategy for media services customers. SPEKE defines the standard for communication between our media services and digital rights management (DRM) system key servers. This project provides the basic framework that partners can specialize and extend to support their specific method of Digital Rights Management while utilizing AWS' video streaming solutions.
Secure Packager and Encoder Key Exchange (SPEKE) is part of the AWS Elemental content encryption protection strategy for media services customers. SPEKE defines the standard for communication between AWS Media Services and digital rights management (DRM) system key servers. SPEKE is used to supply keys to encrypt video on demand (VOD) content through AWS Elemental MediaConvert and for live content through AWS Elemental MediaPackage.
Take a look at high-level SPEKE documentation available on the AWS web site.
Use the provided CloudFormation template to deploy the reference key server into your AWS account. The reference SPEKE implementation provides a key server and key distribution cache for end-to-end segment encyption with HLS and DASH. Use it as an example and starting point when implementing a complete DRM solution with SPEKE.
The CloudFormation template creates an API Gateway, Lambda function, S3 bucket and CloudFront distribution and adds the needed settings for the reference server. Additionally, the template creates IAM policies and roles necessary for API Gateway, Lambda, Secrets Manager, S3 and CloudFront to interact.
The following diagram shows the primary components of the serverless SPEKE solution and the connectivity among the components during runtime. The diagram also shows one possible integration between AWS MediaPackage or AWS MediaConvert and SPEKE.
These sections will guide you through installation, testing and configuration of the SPEKE Reference Server.
Installation - This section includes installation instructions for API Gateway, Lambda deployment and AWS Elemental MediaPackage channel integration.
Test Cases - This page include several unit tests and manual test cases that can be used to verify operation of the SPEKE Reference Server. These test cases do not require integration with additional services.
AWS Elemental MediaPackage - This page documents steps that can be used to verify operation of the SPEKE Reference Server using AWS Elemental MediaPackage.
Contributing - This page includes the guidelines for contributing your enhancements, fixes and documentation to the project.
Code of Conduct - This is what we expect from all people interacting and contributing with the team.
The following page guides the user through deployment and configuration of the SPEKE Reference Server.
pip3 install -r requirements.txt
.zappa_settings.json
under src
, replace aws_region
with the region this lambda will be deployed.local_build.sh
. If you are working on Mac/Windows, run the script with REQUIRES_SPEKE_SERVER_LAMBDA_LAYER=true
to generate speke-libs
lambda layer zip file. Note that Docker is required to build the zip file. See the sidenote below for more details about the lambda layer.build
folder.speke-us-east-1
). Create a folder called speke
and upload the generated speke-reference
lambda zip file. If you build with REQUIRES_SPEKE_SERVER_LAMBDA_LAYER=true
, upload the generated speke-libs
lambda layer zip file to the same folder too.speke_reference.json
, replace rodeolabz
with the name of your created bucket (speke
is used in this example).speke_reference.json
template in CloudFormation to deploy the speke reference server following the instructions below.AWS Lambda environment is similar to Amazon Linux (AL2) and so a dependency that this reference server needs: cffi
does not match the lambda runtime when built on a Windows/ macOS machine. When the reference server is run, it might result in an error: No module named '_cffi_backend'
. To resolve this, it is required to create a lambda layer following the steps outlined here and then update the speke reference lambda function to reference this layer. The local_build.sh
and speke_reference.json
can help you to apply this solution.
Select Template
page, select Upload a template file
and choose the generated speke_reference.json
file prepared in the above section.Specify Details
pages, provide a stack name, like SPEKE
.KeyRetentionDays
parameter. This is the amount of time to retain a key in the S3 bucket for client playback. Keys older than this amount will be automatically removed by S3. The default is 2 days, which is usually enough for live content across multiple time zones.RequiresSPEKEServerLambdaLayer
parameter. If you build and upload the speke-libs
lambda layer zip file, set true
to this parameter to create a lambda layer and associate it with the speke reference lambda function. Otherwise no lambda layer is created by default.Options
page does not require any input, although you can choose to be notified after the template completes.When the template is complete you will have an operational reference SPEKE server that can be used for HLS encryption. You can review the Resources tab of the template to see what was created or updated, and the Outputs tab for the URL of the SPEKE server and the role ARN that permits MediaPackage access.
This solution only supports key creation for the following DRM technologies: Widevine, Playready
This solution will send a blank CPIX response if the Apple Fairplay system ID is used.
For Speke V2.0, this solution works for Widevine, Playready and Fairplay
Due to limitations on size of environment variables provided for a lambda, users must implement their own solution to create and send PSSH, ContentProtectionData and HLSSignalingData for the different DRM systems.
This solution only supports the contentProtection method to handle communication between the reference server solution and the Media Services.
Users must implement copyProtectionData methods in order to handle client/player request to decrypt content.