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

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

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

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

חשוב לא לאבד את המפתח הפרטי! חשוב לשמור את הקובץ .pem במקום סודי ומאובטח, כי תצטרכו אותו כדי לעדכן את התוסף.
עדכון חבילת .crx
כדי לעדכן קובץ .crx של תוסף, מגדילים את מספר הגרסה בקובץ manifest.json.
{
...
"version": "1.5",
...
}
}
{
...
"version": "1.6",
...
}
}
חוזרים אל דף ניהול התוספים ולוחצים על הלחצן PACK EXTENSION (אריזת התוסף). מציינים את הנתיב לספריית התוספים ואת המיקום של המפתח הפרטי.

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

יצירת חבילה באמצעות שורת הפקודה
כדי לארוז תוספים בשורת הפקודה, מפעילים את chrome.exe. משתמשים בדגל --pack-extension כדי לציין את המיקום של תיקיית התוסף, ובדגל --pack-extension-key כדי לציין את המיקום של קובץ המפתח הפרטי של התוסף.
chrome.exe --pack-extension=C:\myext --pack-extension-key=C:\myext.pem
מארח
שרת שמארח קובצי .crx צריך להשתמש בכותרות HTTP מתאימות כדי לאפשר למשתמשים להתקין את התוסף בלחיצה על קישור.
Google Chrome מחשיב קובץ כקובץ שניתן להתקין אם אחד מהתנאים הבאים מתקיים:
- הקובץ הוא מסוג התוכן
application/x-chrome-extension - סיומת הקובץ היא
.crxושני התנאים הבאים מתקיימים:- הקובץ לא מוצג עם כותרת ה-HTTP
X-Content-Type-Options: nosniff - הקובץ is נשלח עם אחד מסוגי התוכן הבאים:
- מחרוזת ריקה
"text/plain""application/octet-stream""unknown/unknown""application/unknown""\*/\*"
- הקובץ לא מוצג עם כותרת ה-HTTP
הסיבה הנפוצה ביותר לכך שלא מזוהה קובץ שניתן להתקנה היא שהשרת שולח את הכותרת X-Content-Type-Options: nosniff. הסיבה השנייה הכי נפוצה היא שהשרת שולח סוג תוכן לא ידוע – סוג שלא מופיע ברשימה הקודמת. כדי לפתור בעיה בכותרת HTTP, צריך לשנות את ההגדרה של השרת או לנסות לארח את קובץ .crx בשרת אחר.
עדכון
כל כמה שעות, הדפדפן בודק את כתובת ה-URL של העדכון של התוספים המותקנים. לכל אחת מהכתובות האלה, המערכת שולחת בקשה לכתובת ה-URL הזו כדי לחפש קובץ XML של מניפסט עדכון.
- התוכן שמוחזר מבדיקת עדכון הוא מסמך XML של מניפסט עדכון שמפרט את הגרסה האחרונה של התוסף.
אם בקובץ המניפסט של העדכון מצוינת גרסה עדכנית יותר מזו שמותקנת, הדפדפן מוריד ומתקין את הגרסה החדשה. בדומה לעדכונים ידניים, צריך לחתום על קובץ .crx החדש באמצעות אותו מפתח פרטי ששימש לחתימה על הגרסה המותקנת הנוכחית.
עדכון כתובת 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. הערך צריך להיות זהה לערך של 'גרסה' בקובץ.crxשל קובץmanifest.json.
קובץ ה-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
- מזהה: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
- גרסה: '1.1'
- תוסף 2
- מזהה: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
- גרסה: '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 ומעלה.