Signaturen generieren

In dieser Anleitung wird erklärt, wie Sie eine Signatur erstellen und welche Felder für Signaturen erforderlich und optional sind.

Zum Erstellen einer Signatur erstellen Sie einen zu signierenden String, der in dieser Anleitung als signierter Wert bezeichnet wird. Der signierte Wert enthält Parameter zur Beschreibung des zu schützenden Inhalts, die Ablaufzeit des signierten Werts usw.

Sie verwenden den signierten Wert beim Erstellen eines Signaturstrings. Zum Erstellen eines Signaturstrings erstellen Sie die Parameter für die Signatur, z. B. eine Signatur mit dem asymmetrischen Schlüssel für Ed25519 des signierten Werts.

Media CDN verwendet die endgültige zusammengesetzte Signatur, um Ihre Inhalte zu schützen.

Unterstützte Signaturformate

Media CDN unterstützt die folgenden signierten Anfrageformate:

Format Verhalten Beispiel
Suchparameter (genaue URL)

Genaue URL zum Gewähren des Zugriffs auf eine bestimmte URL.

Exakt:

https://media.example.com/content/manifest.m3u8?
Expires=EXPIRATION
&KeyName=KEY_NAME
&Signature=SIGNATURE

Suchparameter (URL-Präfix) Durch Angabe eines URLPrefix können Sie ein Präfix signieren und dieselben Abfrageparameter an mehrere URLs innerhalb der Spieler- oder Manifest-Generierung anhängen.

Signieren:

URLPrefix=PREFIX
&Expires=EXPIRATION
&KeyName=KEY_NAME
&Signature=SIGNATURE

Ersetzen Sie PREFIX durch das Präfix, auf das Zugriff gewährt werden soll, einschließlich Schema, Host und Teilpfad.

Pfadkomponente

Präfix: Ermöglicht den Zugriff auf jede URL mit einem Präfix vor der Komponente "/edge-cache-token=[...]".

Dadurch können relative Manifest-URLs die Komponente der signierten URL beim Abrufen von Unterressourcen automatisch übernehmen.

https://media.example.com/video/edge-cache-token=Expires=EXPIRATION
&KeyName=KEY_NAME
&Signature=SIGNATURE/manifest_12382131.m3u8
Signiertes Cookie Präfix: Das Cookie ermöglicht den Zugriff auf jede URL mit dem Präfix, das im signierten URLPrefix-Wert angegeben ist.

Edge-Caching-Cookie:

URLPrefix=PREFIX:
Expires=EXPIRATION:
KeyName=KEY_NAME:
Signature=SIGNATURE

Signatur erstellen

  1. Erstellen Sie einen signierten Wert. Verketten Sie dazu einen String, der die erforderlichen Signaturfelder und die gewünschten optionalen Signaturfelder enthält.

    Falls angegeben, muss URLPrefix an erster Stelle stehen, gefolgt von Expires, KeyName und dann allen optionalen Parametern.

    Trennen Sie die einzelnen Felder und alle Parameter durch Folgendes:

    • Verwenden Sie für Cookies einen Doppelpunkt :.
    • Verwenden Sie für Abfrageparameter und Pfadkomponenten ein Und-Zeichen &.
  2. Signiert den Wert mit einer Ed25519-Signatur.

  3. Hängen Sie an das Ende des Strings ein Feldtrennzeichen (entweder : oder &) gefolgt von Signature= und der Ed25519-Signatur.

Signierte URLs erstellen

Im folgenden Python-Codebeispiel wird gezeigt, wie signierte URLs programmatisch erstellt werden:

import base64
import datetime

import cryptography.hazmat.primitives.asymmetric.ed25519 as ed25519

from six.moves import urllib

def sign_url(url: str, key_name: str, base64_key: str, expiration_time: datetime.datetime) -> str:
    """Gets the Signed URL string for the specified URL and configuration.

    Args:
        url: URL to sign as a string.
        key_name: name of the signing key as a string.
        base64_key: signing key as a base64 encoded byte string.
        expiration_time: expiration time as a UTC datetime object.

    Returns:
        Returns the Signed URL appended with the query parameters based on the
        specified configuration.
    """
    stripped_url = url.strip()
    parsed_url = urllib.parse.urlsplit(stripped_url)
    query_params = urllib.parse.parse_qs(
        parsed_url.query, keep_blank_values=True)
    epoch = datetime.datetime.utcfromtimestamp(0)
    expiration_timestamp = int((expiration_time - epoch).total_seconds())
    decoded_key = base64.urlsafe_b64decode(base64_key)

    url_pattern = u'{url}{separator}Expires={expires}&KeyName={key_name}'

    url_to_sign = url_pattern.format(
            url=stripped_url,
            separator='&' if query_params else '?',
            expires=expiration_timestamp,
            key_name=key_name)

    digest = ed25519.Ed25519PrivateKey.from_private_bytes(
        decoded_key).sign(url_to_sign.encode('utf-8'))
    signature = base64.urlsafe_b64encode(digest).decode('utf-8')
    signed_url = u'{url}&Signature={signature}'.format(
            url=url_to_sign, signature=signature)

    return signed_url

def sign_url_prefix(url: str, url_prefix, key_name: str, base64_key: str, expiration_time: datetime.datetime) -> str:
    """Gets the Signed URL string for the specified URL prefix and configuration.

    Args:
        url: URL of request.
        url_prefix: URL prefix to sign as a string.
        key_name: name of the signing key as a string.
        base64_key: signing key as a base64 encoded string.
        expiration_time: expiration time as a UTC datetime object.

    Returns:
        Returns the Signed URL appended with the query parameters based on the
        specified URL prefix and configuration.
    """
    stripped_url = url.strip()
    parsed_url = urllib.parse.urlsplit(stripped_url)
    query_params = urllib.parse.parse_qs(
        parsed_url.query, keep_blank_values=True)
    encoded_url_prefix = base64.urlsafe_b64encode(
            url_prefix.strip().encode('utf-8')).decode('utf-8')
    epoch = datetime.datetime.utcfromtimestamp(0)
    expiration_timestamp = int((expiration_time - epoch).total_seconds())
    decoded_key = base64.urlsafe_b64decode(base64_key)

    policy_pattern = u'URLPrefix={encoded_url_prefix}&Expires={expires}&KeyName={key_name}'
    policy = policy_pattern.format(
            encoded_url_prefix=encoded_url_prefix,
            expires=expiration_timestamp,
            key_name=key_name)

    digest = ed25519.Ed25519PrivateKey.from_private_bytes(
        decoded_key).sign(policy.encode('utf-8'))
    signature = base64.urlsafe_b64encode(digest).decode('utf-8')
    signed_url = u'{url}{separator}{policy}&Signature={signature}'.format(
            url=stripped_url,
            separator='&' if query_params else '?',
            policy=policy,
            signature=signature)
    return signed_url

Erforderliche Signaturfelder

Die folgenden Felder sind für jede Signatur erforderlich:

  • Expires
  • KeyName
  • Signature

Wenn Abfrageparameter vorhanden sind, müssen sie als letzte Parameter in der URL gruppiert werden. Wenn nicht anders angegeben, wird bei Parameternamen und ihren Werten die Groß-/Kleinschreibung beachtet.

In der folgenden Tabelle werden die einzelnen Parameter erläutert:

Feldname Signaturparameter Signierter Wert
Expires Ganzzahlsekunden, die seit der Unix-Epoche verstrichen sind (1970-01-01T00:00:00Z) Expires=EXPIRATION_TIME, danach ist die Signatur nicht mehr gültig.
KeyName Der Name des EdgeCacheKeyset, der zum Signieren dieser Anfrage verwendet wird. KeyName bezieht sich auf das gesamte Keyset und nicht auf einzelne Schlüssel im Schlüsselsatz selbst. KeyName=EDGE_CACHE_KEYSET
Signature Eine base64-codierte Version der Signatur. Nicht zutreffend

Optionale Signaturfelder

Wenn Abfrageparameter vorhanden sind, müssen sie als letzte Parameter in der URL gruppiert werden. Wenn nicht anders angegeben, wird bei Parameternamen und ihren Werten die Groß-/Kleinschreibung beachtet.

In der folgenden Tabelle werden der Name und die Details der einzelnen Parameter für optionale Signaturparameter erläutert:

Feldname Signaturparameter Signierter Wert
HeaderName

Ein benannter Feldname des Anfrageheaders, der in der Anfrage vorhanden sein muss.

Beim Signieren muss ein Kleinbuchstabe verwendet werden, da die Namen von Headerfeldern die Groß-/Kleinschreibung berücksichtigen. Media CDN verwendet den Header vor der Validierung der Signatur in Kleinbuchstaben.

HeaderName=HEADER_NAME
HeaderValue Ein benannter Wert des Anfrageheaderfelds, der in der Anfrage vorhanden sein muss. Dies ist im Allgemeinen eine Nutzer-ID oder eine andere intransparente Kennzeichnung. Anfragen mit HeaderValue, aber ohne HeaderName werden abgelehnt. HeaderValue=HEADER_VALUE
IPRanges

Eine Liste mit bis zu fünf IPv4- und IPv6-Adressen im CIDR-Format, für die diese URL im websicheren Base64-Format gültig ist. Geben Sie beispielsweise IPRanges=MTkyLjYuMTMuMTMvMzIsMTkzLjUuNjQuMTM1LzMy an, um die IP-Bereiche "192.6.13.13/32,193.5.64.135/32" anzugeben.

Die Aufnahme von IPRanges in die Signaturen ist möglicherweise nicht sinnvoll, wenn Kunden von WAN-Migrationen bedroht sind oder wenn der Netzwerkpfad zu Ihrem Anwendungs-Front-End ein anderer ist als der Bereitstellungspfad. Media CDN lehnt Clients mit einem HTTP 403-Code ab, wenn sie eine Verbindung mit einer IP-Adresse herstellen, die nicht Teil der signierten Anfrage ist.

Die folgenden Fälle können dazu führen, dass Media CDN Clients mit einem HTTP 403-Code ablehnt:

  • Dual-Stack-Umgebungen (IPv4, IPv6)
  • Verbindungsmigration (WLAN zu Mobilfunk und Mobilfunk zu WLAN)
  • Mobile Netzwerke, die Carrier Gateway NAT (CGNAT oder CGN) verwenden
  • Mehrpfad-TCP (MPTCP)

All diese Faktoren können dazu beitragen, dass ein bestimmter Client während einer Videowiedergabesitzung eine nicht-deterministische IP-Adresse hat. Wenn sich die IP-Adresse des Clients ändert, nachdem Sie den Zugriff gewährt haben, und der Client versucht, ein Videosegment in seinen Wiedergabepuffer herunterzuladen, erhält er ein HTTP 403 von Media CDN.

IPRanges=BASE_64_IP_RANGES
URLPrefix Das base64-URL-Präfix, auf das zugegriffen werden soll. Durch die Angabe eines URLPrefix können Sie ein Präfix signieren und dieselben Abfrageparameter an mehrere URLs innerhalb Ihres Players oder Ihrer Manifestgenerierung anhängen. URLPrefix ist erforderlich, wenn Sie das signierte Cookieformat verwenden. URLPrefix=BASE_64_URL_PREFIX