יצירת זוגות של מפתחות אסימטריים

במדריך הזה מוסבר איך ליצור זוגות של מפתחות אסימטריים ל-Media CDN.

יצירת מפתחות

שורת הפקודה

אפשר ליצור מפתח פרטי ומפתח ציבורי באמצעות Python 3 ו-OpenSSL מגרסה 1.1.1 ואילך (גרסאות קודמות של OpenSSL לא תומכות ב-Ed25519).

  1. יוצרים את המפתח הפרטי.

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

    הפעולה הזו יוצרת מפתח פרטי בקידוד PEM. חשוב לשמור על המפתח הזה בצורה מאובטחת, רצוי באמצעות מערכת לניהול מפתחות או Secret Manager.

  2. יוצרים את המפתח הציבורי מהמפתח הפרטי בפורמט Base64 בטוח לשימוש בכתובת 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])"
    

    הפקודה הזו יוצרת את המפתח הציבורי מהמפתח הפרטי, ומסירה את פרטי הכותרת של ASN.1 מהמפתח הציבורי הגולמי.

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

אחרי שיוצרים את המפתח בפורמט הזה, אפשר להוסיף אותו לסט מפתחות. כשקבוצת המפתחות משויכת לנתיב בתור cdnPolicy.signedRequestKeyset, מערכת Media CDN מאמתת שהבקשות נחתמו לפני שהיא מציגה תוכן כלשהו.