אירוח עצמי ל-Linux

Linux היא הפלטפורמה היחידה שבה משתמשי Chrome יכולים להתקין תוספים שמתארחים מחוץ לחנות האינטרנט של Chrome. במאמר הזה נסביר איך לארוז, לארח ולעדכן קובצי crx משרת אינטרנט לשימוש כללי. אם אתם מפיצים תוסף או עיצוב אך ורק דרך חנות האינטרנט של Chrome, כדאי לקרוא את המאמר בנושא אירוח ועדכון בחנות האינטרנט.

Package

תוספים ועיצובים מוצגים כקבצים מסוג .crx. כשמעלים דרך מרכז השליטה למפתחים של Chrome, מרכז השליטה יוצר את הקובץ crx באופן אוטומטי. אם הקובץ crx מפורסם בשרת אישי, צריך ליצור אותו באופן מקומי או להוריד אותו מחנות האינטרנט של Chrome.

הורדת .crx מחנות האינטרנט של Chrome

אם תוסף מסוים מתארח בחנות האינטרנט של Chrome, אפשר להוריד את הקובץ .crx ממרכז השליטה למפתחים. מאתרים את התוסף בקטע 'הרישומים שלך' ולוחצים על 'מידע נוסף'. בחלון הקופץ, לוחצים על הקישור הכחול main.crx כדי להוריד אותו.

הורדת .crx ממרכז השליטה למפתחים

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

יצירת .crx באופן מקומי

ספריות תוספים מומרות לקובצי .crx בדף ניהול התוספים. מנווטים אל chrome://extensions/ בסרגל הכתובות או לוחצים על תפריט Chrome, מחזיקים את הסמן מעל 'כלים נוספים' ובוחרים 'תוספים'.

בדף 'ניהול תוספים', מפעילים את 'מצב פיתוח' על ידי לחיצה על המתג שלצד מצב פיתוח. לאחר מכן לוחצים על הלחצן PACK Extension (תוסף מארז).

מצב הפיתוח מסומן ואז לוחצים על 'חבילת תוסף'

מציינים את הנתיב לתיקייה של התוסף בשדה 'ספריית הבסיס של התוסף', ולאחר מכן לוחצים על הלחצן PACK Extension (תוסף PACK). מתעלמים מהשדה מפתח פרטי כשמדובר בחבילה בפעם הראשונה.

יש לציין נתיב תוסף וללחוץ על 'חבילת תוסף'

Chrome ייצור שני קבצים, קובץ .crx וקובץ .pem, שמכיל את המפתח הפרטי של התוסף.

קובצי תוספים ארוזים

לא לאבד את המפתח הפרטי! שומרים את הקובץ .pem במקום סודי ומאובטח, וצריך לעדכן אותו.

עדכון חבילת .crx

עדכן קובץ .crx של תוסף על ידי הגדלת מספר הגרסה ב-manifest.json.

{
  ...
  "version": "1.5",
  ...
  }
}
{
  ...
  "version": "1.6",
  ...
  }
}

חוזרים אל דף ניהול התוספים ולוחצים על הלחצן תוסף PACK. צריך לציין את הנתיב לספריית התוספים ואת המיקום של המפתח הפרטי.

עדכון קובצי תוספים

בדף יצוין הנתיב לתוסף הארוז המעודכן.

עדכון קובצי תוספים

ארוז דרך שורת הפקודה

תוספי חבילה בשורת הפקודה על ידי ההפעלה של chrome.exe. משתמשים בדגל --pack-extension כדי לציין את מיקום תיקיית התוסף, ובדגל --pack-extension-key כדי לציין את מיקום קובץ המפתח הפרטי של התוסף.

chrome.exe --pack-extension=C:\myext --pack-extension-key=C:\myext.pem

Host

שרת שמארח קובצי .crx חייב להשתמש בכותרות HTTP מתאימות כדי לאפשר למשתמשים להתקין את התוסף באמצעות לחיצה על קישור.

ב-Google Chrome, קובץ נחשב כניתן להתקנה אם מתקיים אחד מהתנאים הבאים:

  • סוג התוכן של הקובץ הוא application/x-chrome-extension
  • הסיומת של הקובץ היא .crx ושני התנאים הבאים נכונים:
    • הקובץ לא מוצג עם כותרת ה-HTTP X-Content-Type-Options: nosniff
    • הקובץ מוצג עם אחד מסוגי התוכן הבאים:
    • מחרוזת ריקה
    • "text/plain"
    • "application/octet-stream"
    • "unknown/unknown"
    • "application/unknown"
    • "\*/\*"

הסיבה הנפוצה ביותר לאי-זיהוי של קובץ שניתן להתקנה היא שהשרת שולח את הכותרת X-Content-Type-Options: nosniff. הסיבה השנייה הכי נפוצה היא שהשרת שולח סוג תוכן לא ידוע שלא מופיע ברשימה הקודמת. כדי לתקן בעיה בכותרת HTTP, צריך לשנות את הגדרות השרת או לנסות לארח את הקובץ .crx בשרת אחר.

עדכון

כל כמה שעות, הדפדפן בודק את התוספים המותקנים כדי למצוא כתובת URL לעדכון. לכל אחת מכתובות ה-URL, שולחים בקשה לכתובת ה-URL הזו ומחפשים קובץ XML לעדכון של מניפסט.

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

אם במניפסט העדכון מצוינת גרסה עדכנית יותר מזו שמותקנת, הדפדפן יוריד ויתקין את הגרסה החדשה. כמו בעדכונים ידניים, קובץ .crx החדש חייב להיות חתום עם אותו מפתח פרטי כמו הגרסה הנוכחית שמותקנת.

הערה: כדי לשמור על פרטיות המשתמשים, Google Chrome לא שולח כותרות של קובצי cookie עם בקשות מניפסט לעדכון אוטומטי. הוא מתעלם מכל כותרת של קובצי cookie שהוגדרו בתגובות לבקשות האלה.

עדכון כתובת ה-URL

תוספים שמתארחים בשרתים מחוץ לחנות האינטרנט של Chrome חייבים לכלול את השדה update_url בקובץ manifest.json שלהם.

{
  "name": "My extension",
  ...
  "update_url": "https://myhost.com/mytestextension/updates.xml",
  ...
}

עדכון המניפסט

מניפסט העדכון שמוחזר על ידי השרת צריך להיות מסמך XML.

<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
  <app appid='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>
    <updatecheck codebase='https://myhost.com/mytestextension/mte_v2.crx' version='2.0' />
  </app>
</gupdate>

פורמט ה-XML הזה לקוח מתשתית העדכון של Omaha, שהיא תשתית העדכונים של Google. מערכת התוספים משתמשת במאפיינים הבאים לאלמנטים <app> ו-<updatecheck> של מניפסט העדכון:

appid
מזהה התוסף נוצר על סמך גיבוב של המפתח הציבורי, כפי שמתואר באריזה. מזהה של תוסף מוצג בדף ניהול התוספים.
codebase
כתובת URL מסוג HTTPS לקובץ .crx.
גרסה
משמש את הלקוח כדי לקבוע אם עליו להוריד את הקובץ .crx שצוין על ידי codebase. היא צריכה להתאים לערך של 'גרסה' בקובץ manifest.json של הקובץ .crx.

קובץ ה-XML של מניפסט העדכון עשוי לכלול מידע על כמה תוספים על ידי הכללת מספר רכיבי <app>.

בדיקה

תדירות בדיקת העדכונים המוגדרת כברירת מחדל היא כמה שעות, אבל ניתן לאלץ עדכון באמצעות הלחצן עדכון תוספים עכשיו בדף ניהול התוספים.

לעדכון התוספים

הפעולה הזו תתחיל לבדוק את כל התוספים שהותקנו.

שימוש מתקדם: פרמטרים של בקשה

מנגנון העדכון האוטומטי הבסיסי תוכנן להקל על העבודה בצד השרת כמו פשוט לשחרר קובץ XML סטטי בכל שרת אינטרנט פשוט כמו Apache, ולעדכן את קובץ ה-XML הזה כשמתפרסמות גרסאות חדשות של תוספים.

מפתחים המארחים מספר תוספים עשויים לבדוק את הפרמטרים של הבקשות, שמציינים את מזהה התוסף והגרסה שלו בבקשת העדכון. השימוש בפרמטרים האלה מאפשר לתוספים להתעדכן מאותה כתובת URL עם קוד דינמי בצד השרת, במקום מקובץ XML סטטי.

הפורמט של הפרמטרים של הבקשה הוא:

?x=EXTENSION_DATA

כאשר EXTENSION_DATA היא מחרוזת בפורמט של כתובת URL בקידודי תווים:

id=EXTENSION_ID&v=EXTENSION_VERSION

לדוגמה, שני תוספים מפנים לאותה כתובת URL לעדכון (https://test.com/extension_updates.php):

  • תוסף 1
    • מזהה: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    • גרסה: "1.1"
  • תוסף 2
    • מזהה: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbvo- לחשבונות
    • גרסה: "0.4"

הבקשה לעדכן כל תוסף בנפרד תהיה:

https://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1

וגם

https://test.com/extension_updates.php?x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4

ניתן לציין מספר תוספים בבקשה אחת לכל כתובת URL ייחודית לעדכון. בדוגמה הקודמת, אם שני התוספים מותקנים אצל המשתמש, שתי הבקשות ממוזגות לבקשה אחת:

https://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1&x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4

אם מספר התוספים המותקנים שמשתמשים באותה כתובת URL לעדכון גדול מספיק, כך שכתובת URL של בקשת GET ארוכה מדי (יותר מ-2,000 תווים), בדיקת העדכונים מנפיקה בקשות GET נוספות, כנדרש.

שימוש מתקדם: גרסת דפדפן מינימלית

ככל שמוסיפים יותר ממשקי API למערכת התוספים, ייתכן שתושק גרסה מעודכנת של תוסף שתעבוד רק בגרסאות חדשות יותר של הדפדפן. למרות ש-Google Chrome מתעדכן באופן אוטומטי, ייתכן שיחלפו מספר ימים עד שרוב בסיס המשתמשים יעודכן לגרסה חדשה כלשהי. כדי להבטיח שעדכון נתון יחול רק על גרסאות של Google Chrome מגרסה ספציפית או יותר, צריך להוסיף את המאפיין 'prodversionmin' לאלמנט <app> בתגובה לעדכון.

<?xml version='1.0' encoding='UTF-8'?>
<gupdate xmlns='http://www.google.com/update2/response' protocol='2.0'>
  <app appid='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'>
    <updatecheck codebase='http://myhost.com/mytestextension/mte_v2.crx' version='2.0' prodversionmin='3.0.193.0'/>
  </app>
</gupdate>

כך אפשר להבטיח שהמשתמשים יתעדכנו באופן אוטומטי לגרסה 2 רק אם מותקנת בהם גרסת Google Chrome 3.0.193.0 ומעלה.