Membuat pasangan kunci asimetris

Panduan ini menunjukkan cara membuat pasangan kunci asimetris untuk Media CDN.

Buat kunci

Command line

Anda dapat membuat kunci pribadi dan publik dengan menggunakan Python 3 dan OpenSSL 1.1.1 atau yang lebih baru (versi OpenSSL sebelumnya tidak mendukung Ed25519).

  1. Buat kunci pribadi.

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

    Tindakan ini menghasilkan kunci pribadi yang dienkode ke PEM. Amankan kunci ini, idealnya dengan menggunakan sistem pengelolaan kunci atau Secret Manager.

  2. Buat kunci publik dari kunci pribadi dalam format base64 yang aman untuk URL.

    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])"
    

    Perintah ini menghasilkan kunci publik dari kunci pribadi, yang menghapus informasi header ASN.1 dari kunci publik mentah.

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}")

Dengan kunci dalam format ini, Anda kini dapat menambahkannya ke keyset. Ketika keyset dikaitkan dengan rute sebagai cdnPolicy.signedRequestKeyset, Media CDN memvalidasi bahwa permintaan telah ditandatangani sebelum menayangkan konten apa pun.