Créer des paires de clés asymétriques

Ce guide explique comment créer des paires de clés asymétriques pour Media CDN.

Générer des clés

Ligne de commande

Vous pouvez générer une clé privée et une clé publique en utilisant Python 3 et OpenSSL 1.1.1 ou version ultérieure (les versions antérieures d'OpenSSL ne sont pas compatibles avec Ed25519).

  1. Générez la clé privée.

    openssl genpkey -algorithm ed25519 -outform PEM -out test.private.key
    

    Cette opération génère une clé privée encodée au format PEM. Sécurisez cette clé, idéalement à l'aide d'un système de gestion de clés ou avec Secret Manager.

  2. Générez la clé publique à partir de la clé privée au format base64 URL-safe.

    openssl pkey -outform DER -pubout -in test.private.key | tail -c +13 | python3 -c "import base64, sys; print(('%s' % base64.urlsafe_b64encode(sys.stdin.buffer.read()))[2:-1])"
    

    Cette commande génère la clé publique à partir de la clé privée, en supprimant les informations d'en-tête ASN.1 de la clé publique brute.

Python

import base64

from cryptography.hazmat.primitives import serialization
from cryptography.hazmat.primitives.asymmetric import ed25519


def generate_ed25519_keypair(
    private_key_filename: str = "private.key", public_key_filename: str = "public.pub"
) -> None:
    """Generate Ed25519 Keys Pairs.

    Args:
        private_key_filename(default private.key): private key filename as a string.
        public_key_filename(default public.pub): public key filename as a string

    Returns:

    """
    private_key = ed25519.Ed25519PrivateKey.generate()
    public_key = private_key.public_key()

    private_key_str = private_key.private_bytes(
        encoding=serialization.Encoding.Raw,
        format=serialization.PrivateFormat.Raw,
        encryption_algorithm=serialization.NoEncryption(),
    )
    print("Private Key:\t", base64.urlsafe_b64encode(private_key_str))

    public_key_str = public_key.public_bytes(
        encoding=serialization.Encoding.Raw, format=serialization.PublicFormat.Raw
    )
    print("Public Key:\t", base64.urlsafe_b64encode(public_key_str))

    with open(private_key_filename, "wb") as fp:
        fp.write(base64.urlsafe_b64encode(private_key_str))
        print(f"Private Key is written to:\t{private_key_filename}")

    with open(public_key_filename, "wb") as fp:
        fp.write(base64.urlsafe_b64encode(public_key_str))
        print(f"Public Key is written to:\t{public_key_filename}")

Avec la clé dans ce format, vous pouvez maintenant l'ajouter à une collection de clés. Lorsque la collection de clés est associée à une route en tant que cdnPolicy.signedRequestKeyset, Media CDN valide la signature des requêtes avant de diffuser du contenu.