Linux ist die einzige Plattform, auf der Chrome-Nutzer Erweiterungen installieren können, die außerhalb des Chrome Web Stores gehostet werden. In diesem Artikel wird beschrieben, wie Sie crx
-Dateien auf einem allgemeinen Webserver verpacken, hosten und aktualisieren können. Wenn Sie eine Erweiterung oder ein Design ausschließlich über den Chrome Web Store vertreiben, lesen Sie den Artikel zum Hosting und Aktualisieren im Web Store.
Paket
Erweiterungen und Designs werden als .crx
-Dateien bereitgestellt. Beim Upload über das Entwickler-Dashboard von Google Chrome wird im Dashboard automatisch die Datei crx
erstellt. Wenn die Datei crx
auf einem persönlichen Server veröffentlicht wird, muss sie lokal erstellt oder aus dem Chrome Web Store heruntergeladen werden.
CRX aus dem Chrome Web Store herunterladen
Wenn eine Erweiterung im Chrome Web Store gehostet wird, kann die Datei .crx
über das Entwickler-Dashboard heruntergeladen werden. Suchen Sie unter „Meine Einträge“ nach der Erweiterung und klicken Sie auf „Weitere Informationen“. Klicken Sie im Pop-up-Fenster auf den blauen Link main.crx
, um das Paket herunterzuladen.
Die heruntergeladene Datei kann auf einem persönlichen Server gehostet werden. Dies ist die sicherste Methode, eine Erweiterung lokal zu hosten, da die Inhalte der Erweiterung vom Chrome Web Store signiert werden. Dies hilft dabei, potenzielle Angriffe und Manipulationen zu erkennen.
CRX lokal erstellen
Erweiterungsverzeichnisse werden auf der Seite zur Verwaltung von Erweiterungen in .crx
-Dateien konvertiert. Gehen Sie in der Omnibox zu chrome://extensions/
oder klicken Sie auf das Chrome-Menü, halten Sie den Mauszeiger über „Weitere Tools“ und wählen Sie „Erweiterungen“ aus.
Aktivieren Sie auf der Seite zur Verwaltung von Erweiterungen den Entwicklermodus, indem Sie auf die Ein/Aus-Schaltfläche neben Entwicklermodus klicken. Klicken Sie dann auf die Schaltfläche PACK ERWEITERUNG.
Geben Sie im Feld „Stammverzeichnis der Erweiterung“ den Pfad zum Ordner der Erweiterung an und klicken Sie dann auf die Schaltfläche ERWEITERUNG. Ignorieren Sie bei einem erstmaligen Paket das Feld Privater Schlüssel.
Chrome erstellt zwei Dateien, eine .crx
-Datei und eine .pem
-Datei, die den privaten Schlüssel der Erweiterung enthält.
Verlieren Sie nicht den privaten Schlüssel. Bewahren Sie die Datei .pem
an einem geheim und sicheren Ort auf. Dazu muss die Erweiterung aktualisiert werden.
CRX-Paket aktualisieren
Aktualisiere die .crx
-Datei einer Erweiterung, indem du die Versionsnummer in manifest.json
erhöhen.
{
...
"version": "1.5",
...
}
}
{
...
"version": "1.6",
...
}
}
Kehren Sie zur Verwaltungsseite für Erweiterungen zurück und klicken Sie auf die Schaltfläche Paketerweiterung. Geben Sie den Pfad zum Verzeichnis für die Erweiterungen und den Speicherort des privaten Schlüssels an.
Die Seite enthält den Pfad für die aktualisierte gepackte Erweiterung.
Über die Befehlszeile verpacken
Verpacken Sie Erweiterungen in der Befehlszeile, indem Sie chrome.exe
aufrufen. Verwenden Sie das Flag --pack-extension
, um den Speicherort des Ordners der Erweiterung anzugeben, und das Flag --pack-extension-key
, um den Speicherort der privaten Schlüsseldatei der Erweiterung anzugeben.
chrome.exe --pack-extension=C:\myext --pack-extension-key=C:\myext.pem
Host
Ein Server, auf dem .crx
-Dateien gehostet werden, muss geeignete HTTP-Header verwenden, damit Nutzer die Erweiterung durch Klicken auf einen Link installieren können.
Für Google Chrome gilt eine Datei als installierbar, wenn eine der folgenden Bedingungen zutrifft:
- Die Datei hat den Inhaltstyp
application/x-chrome-extension
. - Das Dateisuffix lautet
.crx
und beide der folgenden Bedingungen sind erfüllt:- Die Datei wird nicht mit dem HTTP-Header
X-Content-Type-Options: nosniff
bereitgestellt - Die Datei wird mit einem der folgenden Inhaltstypen bereitgestellt:
- Leerer String
"text/plain"
"application/octet-stream"
"unknown/unknown"
"application/unknown"
"\*/\*"
- Die Datei wird nicht mit dem HTTP-Header
Der häufigste Grund dafür, dass eine installierbare Datei nicht erkannt wird, ist, dass der Server den Header X-Content-Type-Options: nosniff
sendet. Der zweithäufigste Grund ist, dass der Server einen unbekannten Inhaltstyp sendet, der nicht in der vorherigen Liste enthalten ist. Um ein HTTP-Header-Problem zu beheben, ändern Sie entweder die Konfiguration des Servers oder hosten Sie die .crx
-Datei auf einem anderen Server.
Aktualisieren
Alle paar Stunden prüft der Browser, ob installierte Erweiterungen eine Update-URL haben. Für jede Anfrage wird eine Anfrage an die betreffende URL gestellt und nach einer Manifest-XML-Datei für die Aktualisierung gesucht.
- Der von einer Updateprüfung zurückgegebene Inhalt ist ein XML-Dokument mit dem Update-Manifest, in dem die neueste Version einer Erweiterung aufgeführt ist.
Wenn im Updatemanifest eine neuere Version als installiert angegeben ist, lädt der Browser die neue Version herunter und installiert sie. Wie bei manuellen Updates muss die neue .crx
-Datei mit demselben privaten Schlüssel wie die aktuell installierte Version signiert sein.
URL aktualisieren
Für Erweiterungen, die auf Servern außerhalb des Chrome Web Stores gehostet werden, muss das Feld update_url
in der Datei manifest.json
enthalten sein.
{
"name": "My extension",
...
"update_url": "https://myhost.com/mytestextension/updates.xml",
...
}
Manifest aktualisieren
Das vom Server zurückgegebene Manifest für die Aktualisierung sollte ein XML-Dokument sein.
<?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>
Dieses XML-Format wurde von Omaha, der Update-Infrastruktur von Google, übernommen. Das Erweiterungssystem verwendet die folgenden Attribute für die Elemente <app>
und <updatecheck>
des Updatemanifests:
- appid
- Die Erweiterungs-ID wird anhand eines Hashwerts des öffentlichen Schlüssels generiert, wie im Abschnitt Verpackung beschrieben. Die ID einer Erweiterung wird auf der Seite „Erweiterungsverwaltung“ angezeigt.
- Codebasis
- Eine HTTPS-URL zur Datei
.crx
- Version
- Wird vom Client verwendet, um zu bestimmen, ob die von
codebase
angegebene Datei.crx
heruntergeladen werden soll. Sie sollte mit dem Wert von „version“ in der Dateimanifest.json
der Datei.crx
übereinstimmen.
Die XML-Datei des Aktualisierungsmanifests kann durch Angabe mehrerer <app>
-Elemente Informationen zu mehreren Erweiterungen enthalten.
Testen
Standardmäßig wird ein Update über mehrere Stunden durchgeführt. Über die Schaltfläche Erweiterungen jetzt aktualisieren auf der Seite zur Verwaltung von Erweiterungen können Sie jedoch ein Update erzwingen.
Dadurch wird eine Prüfung auf alle installierten Erweiterungen gestartet.
Erweiterte Verwendung: Anfrageparameter
Der grundlegende Mechanismus für automatische Updates wurde so konzipiert, dass die serverseitige Arbeit so einfach ist wie das Ablegen einer statischen XML-Datei auf einen einfachen Webserver wie Apache und das Aktualisieren dieser XML-Datei, sobald neue Erweiterungsversionen veröffentlicht werden.
Entwickler, die mehrere Erweiterungen hosten, können Anfrageparameter prüfen, die in der Aktualisierungsanfrage die Erweiterungs-ID und Version angeben. Mit diesen Parametern können Erweiterungen von derselben URL aktualisiert werden, auf der dynamischer serverseitiger Code anstatt einer statischen XML-Datei ausgeführt wird.
Das Format der Anfrageparameter lautet:
?x=EXTENSION_DATA
Dabei ist EXTENSION_DATA
ein URL-codierter String im folgenden Format:
id=EXTENSION_ID&v=EXTENSION_VERSION
So verweisen beispielsweise zwei Erweiterungen auf dieselbe Update-URL (https://test.com/extension_updates.php
):
- Erweiterung 1
- ID: „aaaaaaaaaaaaaaaaaaaaaaaaaaaaa“
- Version: „1.1“
- Erweiterung 2
- ID: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
- Version: „0.4“
Die Anfrage zum Aktualisieren der einzelnen Erweiterungen lautet:
https://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1
sowie
https://test.com/extension_updates.php?x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4
In einer Anfrage können für jede einzelne Update-URL mehrere Erweiterungen aufgeführt werden. Wenn im vorherigen Beispiel ein Nutzer beide Erweiterungen installiert hat, werden die beiden Anfragen zu einer Anfrage zusammengeführt:
https://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1&x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4
Wenn die Anzahl der installierten Erweiterungen mit derselben Update-URL so groß ist, dass eine GET-Anfrage-URL zu lang ist (mehr als 2.000 Zeichen), gibt die Updateprüfung bei Bedarf zusätzliche GET-Anfragen aus.
Erweiterte Nutzung: erforderliche Browserversion
Wenn dem Erweiterungssystem weitere APIs hinzugefügt werden, wird unter Umständen eine aktualisierte Version einer Erweiterung veröffentlicht, die nur mit neueren Versionen des Browsers funktioniert. Google Chrome selbst wird zwar automatisch aktualisiert, es kann jedoch einige Tage dauern, bis der Großteil der Nutzer auf eine neue Version aktualisiert ist. Damit ein bestimmtes Update nur auf Google Chrome-Versionen angewendet wird, die mindestens einer bestimmten Version entsprechen, fügen Sie dem Element <app>
in der Updateantwort das Attribut "prodversionmin" hinzu.
<?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>
Dadurch wird sichergestellt, dass Nutzer nur dann automatisch auf Version 2 aktualisiert werden, wenn sie Google Chrome 3.0.193.0 oder höher verwenden.