סקירה כללית על חתימת ארטיפקטים ב-Assured OSS

Assured Open Source Software מספקת לכם חבילות, מטא-נתונים של חבילות וסקריפטים של כלי עזר. כל חבילת Assured OSS חתומה באמצעות אישור נפרד שהונפק על ידי Google, שמשתמש באלגוריתם ECDSA P256 ליצירת מפתחות. כל מטא-נתונים של חבילה וכל סקריפט של כלי עזר נחתמים גם הם באמצעות אישור יחיד שהונפק על ידי Google, שמשתמש באלגוריתם ECDSA P256 ליצירת מפתחות. האישורים האלה מונפקים באמצעות Certificate Authority Service, ואפשר למצוא את אישור הבסיס הציבורי המתאים בקטגוריה של Cloud Storage.

המסמך הזה רלוונטי לתוכנית בחינם. מידע על חתימות בגרסת הפרימיום זמין במאמר בנושא גישה למטא-נתוני אבטחה ואימות חבילות.

סקירה כללית על חתימות

החתימות מאוחסנות בקובץ signature.zip. קובץ signature.zip מכיל את הקבצים הבאים:

  • digest.txt: בקובץ הזה מאוחסן אלגוריתם הגיבוב יחד עם תקציר החבילה בפורמט מקודד הקסדצימלי. מקרה לדוגמה:

    SHA-256:c5feab6f4de0878e94cf2a3074039b4f16a0c93a03501f047ee6eea29a8e33e0`.
    
  • signature.txt: בקובץ הזה מאוחסן אלגוריתם החתימה יחד עם החתימה בקידוד הקסדצימלי. מקרה לדוגמה:

    ECDSAP256_DER:30450220585d2a01f20de98dfe6cfab2c01a8f11787dbafbc6541304d23cc582e61be016022100f05a19f5ce473144579dfefc47905fd650584a1c7a31bd9d5bf93ecce739a7cb`
    
  • cert.pem: הקובץ הזה מאחסן את האישור הציבורי.

  • certChain.pem: בקובץ הזה מאוחסנת שרשרת האישורים של האישור הציבורי.

אימות חתימות

אפשר לאמת חתימות באחת מהדרכים הבאות:

אימות חתימות באמצעות הכלי aoss-verifier

  1. כדי לאמת את האותנטיות והשלמות של חבילות תוכנה בקוד פתוח, צריך להתקין את הכלי aoss-verifier.

  2. כדי לאמת חבילה, מעבירים את הערכים LANGUAGE, PACKAGE_ID ו-VERSION ואת PATH_TO_DATA_FILE שרוצים לאמת באמצעות הדגלים --language, --package_id, --version ו---artifact_path.

    aoss-verifier verify-package \
       --language LANGUAGE \
       --package_id PACKAGE_ID \
       --version VERSION \
       --artifact_path ARTIFACT_PATH
    

    מחליפים את מה שכתוב בשדות הבאים:

    • LANGUAGE: שפת החבילה. הערך חייב להיות באותיות קטנות.
    • PACKAGE_ID: ב-Java, הפורמט הוא groupId:artifactId. ב-Python, הפורמט הוא packageName. הערך חייב להיות באותיות קטנות.
    • VERSION: הגרסה של החבילה.
    • ARTIFACT_PATH: הנתיב לקובץ הנתונים בספרייה המקומית שרוצים לאמת. משתמשים בסיומות הבאות של שמות קבצים:
      • סיומת הקובץ jar לחבילת Java
      • סיומת הקובץ whl לחבילת Python

אימות חתימות באופן ידני

כדי לאמת את החתימות באופן ידני:

  1. מתקינים את Google Cloud CLI ואת תוכנת OpenSSL, גרסה 3.0.1 ואילך.

  2. מאמתים את ה-digest.

    1. מזהים את אלגוריתם הגיבוב. הקובץ digest.txt מכיל את אלגוריתם הגיבוב שמשמש לחישוב התמצית. מזהים את אלגוריתם הגיבוב באמצעות הפקודה הבאה:

      cut -d ':' -f1 digest.txt
      

      מוודאים שהפלט הוא SHA256.

    2. חישוב תקציר של קובץ הנתונים. אפשר לחשב את הגיבוב של קובץ הנתונים באמצעות כלים שונים של שורת פקודה, בהתאם לאלגוריתם הגיבוב שבו נעשה שימוש. כדי ליצור את הגיבוב של קובצי נתונים וסקריפטים של Assured OSS, צריך להשתמש באלגוריתם הגיבוב SHA-256.

      ב-Linux, משתמשים בפקודה הבאה כדי לחשב את הגיבוב:

      sha256sum PATH_TO_DATA_FILE | cut -d ' ' -f1 > datadigest.txt
      

      כדי לאמת חבילה, מחליפים את PATH_TO_DATA_FILE בנתיב לחבילה בספרייה המקומית לאימות חבילה.

      כדי לאמת את המטא-נתונים, מחליפים את PATH_TO_DATA_FILE בשם קובץ המטא-נתונים. לדוגמה, buildInfo.json, ‏ vexInfo.json או healthInfo.json.

      ב-macOS, משתמשים בפקודה הבאה:

      shasum -a 256 PATH_TO_DATA_FILE | cut -d ' ' -f1 > datadigest.txt
      
    3. מחולצים את הגיבוב מהקובץ digest.txt באמצעות הפקודה הבאה:

      cut -d ':' -f2 digest.txt > signaturedigest.txt
      
    4. משווים בין שני הגיבובים באמצעות הפקודה הבאה:

      diff datadigest.txt signaturedigest.txt
      

      אם אין הבדל, לא תהיה פלט.

  3. אימות החתימה

    1. כדי לקבל מפתח ציבורי מ-cert.pem, משתמשים בפקודה הבאה:

      openssl x509 -pubkey -noout -in cert.pem  > pubkey.pem
      
    2. מחולצים את החתימה בפורמט בינארי באמצעות הפקודה הבאה (אם היא לא קיימת, צריך להתקין את הפקודה xxd):

      cut -d ':' -f2 signature.txt | xxd -r -p > sig.sig
      
    3. מחלקים את התמצית בפורמט בינארי באמצעות הפקודה הבאה:

      cut -d ':' -f2 digest.txt | xxd -r -p > digest.bin
      
    4. מאמתים את החתימה באמצעות אחת מהפקודות הבאות:

      אפשרות 1

      openssl pkeyutl -in digest.bin -inkey pubkey.pem -pubin -verify -sigfile sig.sig
      

      הפקודה מחזירה את הפלט הבא:

      Signature Verified Successfully

      אפשרות 2

      openssl dgst -sha256 -verify pubkey.pem -signature sig.sig PATH_TO_DATA_FILE
      

      מחליפים את PATH_TO_DATA_FILE בנתיב לקובץ הנתונים בספרייה המקומית.

      הפקודה מחזירה את הפלט הבא:

      Verified OK

  4. אימות האישור

    כדי לאמת את האישור, מריצים את הפקודה הבאה:

    openssl verify -verbose -CAfile ca.crt -untrusted certChain.pem cert.pem
    

    ca.cert הוא אישור הבסיס שאפשר להוריד באמצעות הפקודה הזו:

    curl -o PATH_TO_LOCAL_STORE https://privateca-content-6333d504-0000-2df7-afd6-30fd38154590.storage.googleapis.com/a2c725a592f1d586f1f8/ca.crt
    

    אם הפעולה מצליחה, מתקבל הפלט הבא:

    cert.pem: OK

אימות חתימות באמצעות סקריפט

כדי להשתמש בסקריפט אימות לאימות חתימות, פועלים לפי השלבים הבאים:

  1. מורידים את סקריפט האימות.

    1. מגדירים אימות באמצעות Application Default Credentials ‏ (ADC).

    2. מורידים את signatureverification.sh, ‏ README.md ואת signature.zip לסקריפט האימות באמצעות הפקודה הבאה:

      gcloud storage cp "gs://cloud-aoss/utils/signature-verification/v1.0" PATH_TO_LOCAL_STORE --recursive
      

      מחליפים את PATH_TO_LOCAL_STORE בנתיב המקומי שבו רוצים להוריד את הקובץ.

      אפשר גם לבצע אימות של סקריפט כלי עזר באמצעות סקריפט האימות.

  2. כדי להריץ את הסקריפט:

    1. מתקינים את Google Cloud CLI ואת תוכנת OpenSSL, גרסה 3.0.1 ואילך.

    2. מבצעים אימות באמצעות חשבון השירות שיש לו הרשאה לגשת ל-Assured OSS.

    3. נותנים את ההרשאות הנדרשות להרצת הסקריפט באמצעות הפקודה הבאה:

      chmod +x signatureverification.sh
      
    4. אם לא הורדתם את הקובץ signature.zip, מריצים את הסקריפט באמצעות הפקודה הבאה:

      ./signatureverification.sh --data_file_path PATH_TO_DATA_FILE \
      --signature_url SIGNATURE_ZIP_URL \
      --root_cert_url ROOT_CERT_URL
      

      מחליפים את מה שכתוב בשדות הבאים:

      • PATH_TO_DATA_FILE: הנתיב לקובץ הנתונים בספרייה המקומית שרוצים לאמת
      • SIGNATURE_ZIP_URL: כתובת ה-URL של קובץ ה-ZIP של החתימה
      • ROOT_CERT_URL: כתובת ה-URL של אישור הבסיס הציבורי

פלט לדוגמה

הפלט הבא מציין שסקריפט האימות פעל בהצלחה.

Signature verification successful

Certificate verification successful

המאמרים הבאים