הגדרת OpenSSL להצפנת מפתח ידנית

כדי לייבא מפתח ל-Cloud KMS, צריך לעטוף אותו באמצעות סכמת PKCS#11 CKM_RSA_AES_KEY_WRAP, שכוללת גם את RSA-OAEP (שנכלל ב-OpenSSL 1.1 כברירת מחדל) וגם את AES Key Wrap with Padding (שלא נכלל). המנגנון הזה לא כלול ב-OpenSSL.

מומלץ להשתמש ב-Google Cloud CLI כדי לעטוף כל מפתח באופן אוטומטי במהלך הייבוא. אם אתם צריכים לבצע עטיפה של המפתחות באופן ידני בגלל דרישות תאימות או דרישות רגולטוריות, אתם צריכים קודם לבצע קומפילציה מחדש של OpenSSL כדי להוסיף תמיכה בעטיפת מפתחות AES עם ריפוד. אחרי הידור מחדש של OpenSSL, אפשר לעטוף את המפתח באופן ידני.

לפני שמתחילים

אל תחליפו את קובצי ה-OpenSSL הבינאריים המובנים במערכת בקובצי ה-OpenSSL הבינאריים המתוקנים שנוצרו בעקבות הפעולות שמתוארות בנושא הזה. לדוגמה, אל תתקינו את OpenSSL עם התיקון ישירות ב-/usr. אם תפעלו בדיוק לפי ההליך הזה, גרסת OpenSSL עם התיקון תיווצר ב-$HOME/build ותותקן ב-$HOME/local/bin.

אם ${HOME}/local/bin כבר קיים, צריך לגבות את התוכן שלו או להעביר את הקבצים למקום אחר לפני שמבצעים את השלבים שמתוארים בנושא הזה.

החלת תיקון והתקנה של OpenSSL v1.1.0

אם אתם בוחרים להשתמש ב-OpenSSL כדי לארוז את המפתחות באופן ידני לפני שאתם מייבאים אותם ל-Cloud KMS, אתם צריכים להשתמש ב-OpenSSL מגרסה 1.1.0 ואילך, עם תיקון ה-patch הבא. תצטרכו לקמפל את OpenSSL ולהתקין אותו במיקום נפרד מההתקנה של OpenSSL שמוגדרת כברירת מחדל במערכת.

  1. מורידים את המקור של גרסת OpenSSL 1.1.0l מהכתובת https://www.openssl.org/source. זו הגרסה האחרונה בשורת הקוד 1.1.0. במהלך התהליך הזה, אל תשתמשו בגרסה חדשה יותר של OpenSSL, כמו גרסה v1.1.1. התיקון ייכשל.

  2. מחזירים את הארכיון אל ${HOME}/build/openssl/ באמצעות הפקודה הבאה. הפקודה הזו מבטלת את ברירת המחדל של הספרייה, שכוללת את הגרסה של OpenSSL ומשתנה לעיתים קרובות. מחליפים את הערך ב-/path/to/downloaded-openssl.tar.gz בנתיב לארכיון .tar.gz שהורדתם.

    # Create the directory for the eventual OpenSSL binaries
    mkdir -p ${HOME}/local/ssl
    
    # Create the build directory
    mkdir -p ${HOME}/build/openssl
    
    # Extract the archive to ${HOME}/build/openssl
    tar xzvf /path/to/downloaded-openssl.tar.gz \
      -C ${HOME}/build/openssl/ \
      --strip-components 1
    
  3. מחילים תיקון בהתאמה אישית על המקור שחולץ של OpenSSL באמצעות הפקודות הבאות.התיקון מאפשר את הדגל EVP_CIPHER_CTX_FLAG_WRAP_ALLOW.

    cd ${HOME}/build
    cat <<-EOF | patch -d . -p0
    --- orig/openssl/apps/enc.c 2020-01-17 14:39:54.991708785 -0500
    +++ openssl/apps/enc.c  2020-01-17 14:41:33.215704269 -0500
    @@ -482,6 +482,7 @@
              */
    
             BIO_get_cipher_ctx(benc, &ctx);
    +   EVP_CIPHER_CTX_set_flags(ctx, EVP_CIPHER_CTX_FLAG_WRAP_ALLOW);
    
             if (!EVP_CipherInit_ex(ctx, cipher, NULL, NULL, NULL, enc)) {
                 BIO_printf(bio_err, "Error setting cipher %s\n",
    EOF
    

  4. מריצים את הפקודות הבאות כדי ליצור את הקבצים הבינאריים ואת הספריות של OpenSSL מהמקור המתוקן, לבדוק את התקינות של הבנייה ולהתקין את הקבצים הבינאריים ואת הספריות בספרייה ${HOME}/local.

    CPUS=$(getconf _NPROCESSORS_ONLN)
    cd ${HOME}/build/openssl
    ./config --prefix=${HOME}/local --openssldir=${HOME}/local/ssl
    make -j${CPUS}
    make test
    make install
    

    כדי לוודא שלא תדרסו את ההתקנה של OpenSSL במערכת, אל תשמיטו או תשנו את הדגלים --prefix או --openssldir.

  5. מריצים את הפקודה הבאה כדי לוודא שקובץ ה-OpenSSL הבינארי החדש הותקן בהצלחה:

    test -x ${HOME}/local/bin/openssl || echo FAIL
    

    אם הקבצים הבינאריים מותקנים בצורה תקינה, לא אמור להיות פלט. אם רואים את השגיאה FAIL, בודקים את הפלט של הפקודות make, make test ו-make install שהרצתם קודם.

  6. הקובצים הבינאריים של OpenSSL שעברו תיקון מקושרים באופן דינמי לספריות OpenSSL ב-${HOME}/local/ssl/lib/, אבל הפקודה ld לא מבצעת אינדוקס של הספריות האלה כברירת מחדל. מריצים את הפקודות הבאות כדי ליצור סקריפט wrapper שמוסיף את הספריות המתוקנות אל ${LD_LIBRARY_PATH} לפני הפעלת ה-CLI עבור OpenSSL המתוקן.

    cat > ${HOME}/local/bin/openssl.sh <<-EOF
    #!/bin/bash
    env LD_LIBRARY_PATH=${HOME}/local/lib/ ${HOME}/local/bin/openssl "\$@"
    EOF
    chmod u+x ${HOME}/local/bin/openssl.sh
    

  7. כדי לבדוק שגרסת OpenSSL שהסקריפט מפעיל היא הגרסה שבדיוק יצרתם והתקנתם, משתמשים בפקודה הבאה:

    ${HOME}/local/bin/openssl.sh version
    

עכשיו אפשר להפעיל את סקריפט העטיפה ${HOME}/local/bin/openssl.sh כדי לעטוף מפתחות באופן ידני לצורך ייבוא.