במאמר הזה נסביר איך לארוז מפתח באופן ידני לפני ייבוא המפתח ל-Cloud KMS. צריך לפעול לפי ההוראות שבמאמר הזה רק אם לא רוצים להשתמש ב-Google Cloud CLI כדי להצפין את המפתח באופן אוטומטי לפני הייבוא. לסקירה כללית של ההבדלים, אפשר לעיין במאמר איך מתבצע ייבוא מפתחות.
אפשר לבצע את השלבים במאמר הזה תוך 5 עד 10 דקות, לא כולל השלבים שבקטע לפני שמתחילים.
לפני שמתחילים
לפני שמצפינים מפתח, צריך לוודא שמתקיימות הדרישות המוקדמות הבאות.
- יצירת אוסף מפתחות ומפתח ליעד, ויצירת משימת ייבוא.
- מוודאים שהמפתח זמין באופן מקומי ושהפורמט שלו נכון לייבוא ל-Cloud KMS.
- החלת תיקון (patch) והידור מחדש של OpenSSL
אחזור מפתח העטיפה
בקטע הזה מוסבר איך לאחזר את מפתח העטיפה מעבודת הייבוא שיצרתם בקטע לפני שמתחילים. מומלץ להשתמש במסוף Google Cloud .
המסוף
נכנסים לדף Key Management במסוף Google Cloud .
לוחצים על השם של אוסף המפתחות שמכיל את עבודת הייבוא.
לוחצים על הכרטיסייה Import Jobs (פעולות ייבוא) בחלק העליון של הדף.
לוחצים על אפשרויות נוספות more_vert, ואז על הורדת מפתח העטיפה בתפריט הקופץ.
CLI של gcloud
כדי לוודא שמשימת הייבוא פעילה, מריצים את הפקודה gcloud kms import-jobs describe:
gcloud kms import-jobs describe IMPORT_JOB \ --location LOCATION \ --keyring KEY_RING \ --format="value(state)"
state: ACTIVE
מריצים את הפקודה הבאה כדי לשמור את המפתח הציבורי ממשימת הייבוא ב-${HOME}/wrapping-key.pem
gcloud kms import-jobs describe \
--location=LOCATION \
--keyring=KEY_RING \
--format="value(publicKey.pem)" \
IMPORT_JOB > ${HOME}/wrapping-key.pem
API
מבצעים קריאה ל-method
ImportJob.get.שולפים את המפתח הציבורי דרך השדה
publicKeyבתגובתImportJob.get. הערך הזה הוא מסוגWrappingPublicKey. השדהpemמהסוגWrappingPublicKeyהוא המפתח הציבורי בקידוד בפורמט PEM (דואר עם פרטיות משודרגת).
מידע נוסף על פורמט PEM זמין ב-RFC 7468, במיוחד בקטעים General Considerations ו-Textual Encoding of Subject Public Key Info.
הגדרה של משתני סביבה
פקודות OpenSSL דורשות כמה נתיבי קבצים כערכי קלט. כדי להקל על הפעלת הפקודות, מגדירים משתני סביבה לנתיבי הקבצים. חשוב לוודא שיש לכם הרשאת כתיבה לספריות שמוגדרות בהמשך.
מגדירים את המשתנה
PUB_WRAPPING_KEYלנתיב המלא של מפתח העטיפה שהורדתם מעבודת הייבוא. מפתח העטיפה מסתיים ב-.pem.PUB_WRAPPING_KEY="WRAPPING_KEY_PATH"
מגדירים את המשתנה
TARGET_KEYלנתיב המלא של המפתח שלא עבר פענוח (מפתח היעד).TARGET_KEY=TARGET_KEY_PATH
מחליפים את הערך
TARGET_KEY_PATHבנתיב לקובץ.binשל מפתחות סימטריים או בנתיב לקובץ.derשל מפתחות אסימטריים.אם משתמשים ב-RSA-AES, מגדירים את המשתנה
TEMP_AES_KEYלנתיב המלא למפתח ה-AES הזמני.TEMP_AES_KEY=TEMP_AES_KEY_PATH
מגדירים את המשתנה
WRAPPED_KEYלנתיב המלא שבו רוצים לשמור את מפתח היעד העטוף שמוכן לייבוא.WRAPPED_KEY=WRAPPED_KEY_PATH
מוודאים שכל משתני הסביבה מוגדרים בצורה נכונה באמצעות הפקודות הבאות:
echo "PUB_WRAPPING_KEY: " ${PUB_WRAPPING_KEY}; \ echo "TARGET_KEY: " ${TARGET_KEY}; \ echo "TEMP_AES_KEY: " ${TEMP_AES_KEY}; \ echo "WRAPPED_KEY: " ${WRAPPED_KEY}
אחרי שהמשתנים מוגדרים בצורה נכונה, אפשר לעטוף את המפתח. יש שתי גישות, כפי שמתואר בהמשך: עם RSA בלבד או עם RSA-AES.
עוטפים את המפתח
עוטפים את המפתח באמצעות RSA
בגישה הזו, מפתח היעד עטוף בבלוק RSA. לכן, גודל מפתח היעד מוגבל. לדוגמה, אי אפשר להשתמש בשיטה הזו כדי להצפין מפתח RSA אחר. שיטות הייבוא הנתמכות הן rsa-oaep-3072-sha256 ו-rsa-oaep-4096-sha256.
עוטפים את מפתח היעד במפתח האריזה הציבורי באמצעות האלגוריתם
CKM_RSA_PKCS_OAEP:openssl pkeyutl \ -encrypt \ -pubin \ -inkey ${PUB_WRAPPING_KEY} \ -in ${TARGET_KEY} \ -out ${WRAPPED_KEY} \ -pkeyopt rsa_padding_mode:oaep \ -pkeyopt rsa_oaep_md:sha256 \ -pkeyopt rsa_mgf1_md:sha256
עוטפים את המפתח באמצעות RSA-AES
בגישה הזו, מפתח היעד עטוף במפתח AES זמני. לאחר מכן מפתח ה-AES הזמני נארז באמצעות מפתח ה-RSA. שני המפתחות העטופים האלה משורשרים ומיוצאים. מכיוון שמפתח היעד מוצפן באמצעות AES ולא באמצעות RSA, אפשר להשתמש בגישה הזו כדי להצפין מפתחות גדולים. שיטות הייבוא הנתמכות הן rsa-oaep-3072-sha1-aes-256, rsa-oaep-4096-sha1-aes-256, rsa-oaep-3072-sha256-aes-256 ו-rsa-oaep-4096-sha256-aes-256.
יצירת מפתח AES רנדומלי זמני באורך 32 בייט ושמירתו במיקום שמזוהה על ידי
${TEMP_AES_KEY}:openssl rand -out "${TEMP_AES_KEY}" 32מצפינים את מפתח ה-AES הזמני באמצעות מפתח האריזה הציבורי, באלגוריתם
CKM_RSA_PKCS_OAEP. אם שיטת הייבוא היאrsa-oaep-3072-sha1-aes-256אוrsa-oaep-4096-sha1-aes-256, משתמשים ב-sha1בשבילrsa_oaep_mdו-rsa_mgf1_md. משתמשים ב-sha256בשבילrsa-oaep-3072-sha256-aes-256ו-rsa-oaep-4096-sha256-aes-256.openssl pkeyutl \ -encrypt \ -pubin \ -inkey ${PUB_WRAPPING_KEY} \ -in ${TEMP_AES_KEY} \ -out ${WRAPPED_KEY} \ -pkeyopt rsa_padding_mode:oaep \ -pkeyopt rsa_oaep_md:{sha1|sha256} \ -pkeyopt rsa_mgf1_md:{sha1|sha256}מגדירים את המשתנה
OpenSSL_V110לנתיב של סקריפטopenssl.sh. אם פעלתם בדיוק לפי ההוראות לתיקון וקומפילציה מחדש של OpenSSL, תוכלו להשתמש בפקודה הזו בלי לשנות את ערך המשתנה.OPENSSL_V110="${HOME}/local/bin/openssl.sh"עוטפים את מפתח היעד במפתח ה-AES הזמני באמצעות האלגוריתם
CKM_AES_KEY_WRAP_PADומצרפים אותו ל-WRAPPED_KEY."${OPENSSL_V110}" enc \ -id-aes256-wrap-pad \ -iv A65959A6 \ -K $( hexdump -v -e '/1 "%02x"' < "${TEMP_AES_KEY}" ) \ -in "${TARGET_KEY}" >> "${WRAPPED_KEY}"הדגל
-iv A65959A6מגדיר את הערך A65959A6 כערך ההתחלתי החלופי. הדרישה הזו מופיעה במפרט RFC 5649.
המאמרים הבאים
- המפתח העטוף שנשמר ב-
WRAPPED_KEYמוכן עכשיו לייבוא. כדי לייבא את המפתח, פועלים לפי ההוראות במאמר ייבוא של מפתח שעבר עטיפה ידנית.