במדריך הזה מוסבר איך ליצור מפתח Cloud HSM לחתימה על Microsoft Authenticode באמצעות PKCS#11 ו-Jsign.
תרחישים לדוגמה
תהליך העבודה שמתואר במסמך הזה עוזר לטפל בצרכי האבטחה הבאים של הארגון:
- חתימת קושחה באמצעות מפתח פרטי שמוגן על ידי HSM ברמה 3 של FIPS140-2.
- חתימה על ארטיפקטים של Windows בלי להשתמש ב-signtool.
לפני שמתחילים
כדי להשלים את המדריך הזה, תצטרכו:
- מחשב Windows עם הארטיפקטים שרוצים לחתום עליהם. צריך לוודא ש-Java מותקנת במחשב הזה.
Cloud Shell או מחשב Linux משלכם, כדי ליצור בקשת חתימה על אישור או אישור. במחשב הזה, משלימים את ההגדרה שמתועדת במאמר הגדרת OpenSSL.
אם עוד לא הפעלתם את הפקודה gcloud auth application-default login, חשוב לעשות זאת.
במחשב Windows, מורידים את קובץ ה-JAR של הגרסה האחרונה של Jsign באמצעות פקודת ה-PowerShell הבאה:
wget https://github.com/ebourg/jsign/releases/download/JSIGN.VERSION/jsign-JSIGN.VERSION.jar -O jsign.jar
הגדרות אישיות
יצירת מפתח חתימה שמתארח ב-Cloud KMS
באמצעות Cloud Shell או המחשב שלכם, יוצרים אוסף מפתחות של Cloud KMS בפרויקט Google Cloud באמצעות הפקודה הבאה:
gcloud kms keyrings create "KEY_RING" --location "LOCATION"
לאחר מכן, יוצרים מפתח לחתימה בחומרה של Cloud KMS EC-P256-SHA256 בפרויקטGoogle Cloud ובאוסף המפתחות שיצרתם:
gcloud kms keys create "KEY_NAME" --keyring "KEY_RING" \
--project "PROJECT_ID" --location "LOCATION" \
--purpose "asymmetric-signing" --default-algorithm "ec-sign-p256-sha256" \
--protection-level "hsm"
הורדת אישור ה-HSM
אישור HSM הוא הוכחה לכך שהמפתח נמצא ב-HSM. יכול להיות שרשות האישורים (CA) תדרוש את ההוכחה הזו כדי להנפיק אישור אימות מורחב (EV).
כדי להוריד את אישור ה-HSM שמשויך למפתח Cloud KMS:
נכנסים לדף Key Management במסוף Google Cloud .
בוחרים את אוסף המפתחות שמכיל את המפתח שרוצים לאמת, ואז בוחרים את המפתח.
לוחצים על עוד more_vert לצד גרסת המפתח שרוצים לאמת, ואז לוחצים על אימות האישור.
בתיבת הדו-שיח Verify attestation (אימות אישור), לוחצים על Download attestation bundle (הורדת חבילת אישורים). קובץ ZIP יורד למחשב ומכיל את שרשראות האישורים והאימות.
הוראות מלאות לאימות האישור שהורד זמינות במאמר בנושא ניתוח האישור.
יצירת אישור בחתימה עצמית באמצעות OpenSSL
השלב הזה הוא אופציונלי, אבל הוא עוזר להכיר את השלבים הבאים לפני שמתחילים בתהליך ומשלמים על רכישת אישור שחתום על ידי רשות אישורים.
באמצעות Cloud Shell או המחשב שלכם, יוצרים אישור בחתימה עצמית עם מפתח החתימה שמתארח ב-Cloud KMS. אפשר להשתמש ב-OpenSSL כדי להשתמש ב-URI של PKCS #11 במקום בנתיב קובץ, ולזהות את המפתח לפי התווית שלו. בספריית Cloud KMS PKCS #11, התווית של המפתח שווה לשם ה-CryptoKey.
openssl req -new -x509 -days 3650 -subj '/CN=test/' -sha256 -engine pkcs11 \
-keyform engine -key pkcs11:object=KEY_NAME > ca.cert
אם הפקודה הזו נכשלת, יכול להיות שהאילוץ PKCS11_MODULE_PATH הוגדר בצורה שגויה, או שאין לכם את ההרשאות הנכונות לשימוש במפתח החתימה של Cloud KMS.
עכשיו אמור להיות לכם אישור שנראה כך:
-----BEGIN CERTIFICATE-----
...
...
...
-----END CERTIFICATE-----
מעתיקים את האישור למחשב Windows כדי שאפשר יהיה להשתמש בו עם Jsign לחתימה על הארטיפקטים.
יצירת בקשת חתימה על אישור חדשה
אפשר ליצור בקשת חתימה על אישור (CSR) למפתח חתימה ב-Cloud HSM. צריך לבצע את השלבים האלה אם רשות האישורים דורשת CSR כדי ליצור אישור חדש לחתימת קוד.
מריצים את הפקודה הבאה באמצעות Cloud Shell או המכונה שלכם:
openssl req -new -subj '/CN=CERTIFICATE_NAME/' DIGEST_FLAG \
-engine pkcs11 -keyform engine \
-key pkcs11:id=KEY_ID > REQUEST_NAME.csr
מחליפים את מה שכתוב בשדות הבאים:
-
CERTIFICATE_NAME: שם לאישור שרוצים ליצור. -
DIGEST_FLAG: דגל שמציין את סוג התקציר. משתמשים ב--sha256, ב--sha384או ב--sha512בהתאם לאלגוריתם של המפתח. -
KEY_ID: מזהה המשאב המלא של גרסת מפתח חתימה אסימטרי, לדוגמה,projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1. -
REQUEST_NAME: שם לבקשת חתימת האישור.
חשוב להשתמש באפשרויות הנכונות של -sigopt לסוג המפתח שבו אתם משתמשים.
אחרי שיש לכם את ה-CSR, אתם יכולים לספק אותו לרשות האישורים (CA) כדי לקבל את אישור החתימה. משתמשים באישור שסופק על ידי רשות האישורים בקטע הבא.
חתימה על ארטיפקט באמצעות Jsign
אחרי שיצרתם אישור (בחתימה עצמית או שהתקבל מרשות אישורים) והעתקתם אותו למחשב Windows, אתם יכולים להשתמש בו כדי לחתום על ארטיפקט של Windows.
כדי לראות רשימה של פורמטים נתמכים של קבצים, מריצים את הפקודה jsign --help.
משתמשים ב-Jsign כדי לחתום על הארטיפקטים באמצעות מפתח Cloud KMS והאישור שלכם.
java -jar PATH_TO_JSIGN.JAR --storetype GOOGLECLOUD \
--storepass $(gcloud auth application-default print-access-token) \
--keystore projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING \
--alias KEY_NAME \
--certfile PATH_TO_CA.CERT
PATH_TO_ARTIFACT_TO_SIGN
מחליפים את מה שכתוב בשדות הבאים:
-
PATH_TO_JSIGN.JAR: הנתיב אלjsign.jar. -
PATH_TO_CA.CERT: הנתיב לאישורca.cert. -
PATH_TO_ARTIFACT_TO_SIGN: הנתיב לארטיפקט שרוצים לחתום עליו.
הסבר מפורט על כל אפשרות של פקודה מופיע במאמרי העזרה הרשמיים של Jsign.