Linux ist die einzige Plattform, auf der Chrome-Nutzer Erweiterungen installieren können, die nicht im
Chrome Web Store gehostet werden. In diesem Artikel wird beschrieben, wie Sie crx-Dateien von einem Allzweck-Webserver packen, hosten und aktualisieren. Wenn Sie eine Erweiterung oder ein Design ausschließlich
über den Chrome Web Store vertreiben, lesen Sie den Hilfeartikel Hosten und
Aktualisieren im Chrome Web Store.
Paket
Erweiterungen und Designs werden als .crx-Dateien bereitgestellt. Wenn Sie sie über das Chrome Developer
Dashboard hochladen, wird die crx Datei automatisch erstellt. Wenn sie auf einem privaten Server veröffentlicht werden, muss die crx-Datei lokal erstellt oder aus dem Chrome Web Store heruntergeladen werden.
.crx-Datei aus dem Chrome Web Store herunterladen
Wenn eine Erweiterung im Chrome Web Store gehostet wird, kann die .crx-Datei aus dem Entwickler-Dashboard heruntergeladen werden. Suchen Sie die Erweiterung unter „Meine Einträge“ und klicken Sie auf „Weitere Informationen“. Klicken Sie im Pop-up-Fenster auf den blauen Link main.crx, um die Datei herunterzuladen.

Die heruntergeladene Datei kann auf einem privaten Server gehostet werden. Dies ist die sicherste Methode, eine Erweiterung lokal zu hosten, da die Inhalte der Erweiterung vom Chrome Web Store signiert werden. So lassen sich potenzielle Angriffe und Manipulationen erkennen.
.crx-Datei lokal erstellen
Erweiterungsverzeichnisse werden auf der Seite „Erweiterungen verwalten“ in .crx-Dateien konvertiert. Rufen Sie in der Omnibox chrome://extensions/ auf oder klicken Sie auf das Chrome-Menü, bewegen Sie den Mauszeiger auf „Weitere Tools“ und wählen Sie dann „Erweiterungen“ aus.
Aktivieren Sie auf der Seite „Erweiterungen verwalten“ den Entwicklermodus, indem Sie auf den Schalter neben Entwicklermodus klicken. Klicken Sie dann auf die Schaltfläche ERWEITERUNG PACKEN.

Geben Sie im Feld „Stammverzeichnis der Erweiterung“ den Pfad zum Ordner der Erweiterung an und klicken Sie dann auf die Schaltfläche ERWEITERUNG PACKEN. Ignorieren Sie das Feld Privater Schlüssel für ein erstmaliges Paket.

Chrome erstellt zwei Dateien: eine .crx-Datei und eine .pem-Datei, die den privaten Schlüssel der Erweiterung enthält.

Verlieren Sie den privaten Schlüssel nicht! Bewahren Sie die .pem Datei an einem geheimen und sicheren Ort auf. Sie wird
benötigt, um die Erweiterung zu aktualisieren.
.crx-Paket aktualisieren
Aktualisieren Sie die .crx-Datei einer Erweiterung, indem Sie die Versionsnummer in manifest.json erhöhen.
{
...
"version": "1.5",
...
}
}
{
...
"version": "1.6",
...
}
}
Kehren Sie zur Seite „Erweiterungen verwalten“ zurück und klicken Sie auf die Schaltfläche ERWEITERUNG PACKEN. Geben Sie den Pfad zum Erweiterungsverzeichnis und den Speicherort des privaten Schlüssels an.

Auf der Seite wird der Pfad zur aktualisierten gepackten Erweiterung angezeigt.

Über die Befehlszeile packen
Sie können Erweiterungen in der Befehlszeile packen, indem Sie chrome.exe aufrufen. Verwenden Sie das --pack-extension
Flag, um den Speicherort des Ordners der Erweiterung anzugeben, und das --pack-extension-key Flag, 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 die entsprechenden HTTP-Header haben, damit Nutzer die Erweiterung durch Klicken auf einen Link installieren können.
Für Google Chrome ist eine Datei installierbar, wenn einer der folgenden Punkte zutrifft:
- Die Datei hat den Inhaltstyp
application/x-chrome-extension. - Das Suffix der Datei ist
.crxund beide der folgenden Punkte treffen zu:- Die Datei weist nicht den folgenden HTTP-Header auf:
X-Content-Type-Options: nosniff - Die Datei hat einen der folgenden Inhaltstypen:
- Leerer String
"text/plain""application/octet-stream""unknown/unknown""application/unknown""\*/\*"
- Die Datei weist nicht den folgenden HTTP-Header auf:
Das Senden des Headers X-Content-Type-Options: nosniff durch den Server ist der häufigste Grund dafür, dass eine Installationsdatei nicht erkannt wird. Der zweithäufigste Grund ist das Senden eines unbekannten Inhaltstyps, der sich nicht in der oben stehenden Liste befindet. Das Problem mit dem HTTP-Header lässt sich beheben, indem Sie die Konfiguration des Servers ändern oder die .crx-Datei auf einem anderen Server hosten.
Aktualisieren
Der Browser sucht alle paar Stunden nach einer Update-URL für installierte Erweiterungen. Für jede Erweiterung wird eine Anfrage an diese URL gesendet, um nach einer XML-Datei mit einem Update-Manifest zu suchen.
- Der Inhalt, der bei einer Update-Prüfung zurückgegeben wird, ist ein XML-Dokument mit einem Update-Manifest, in dem die neueste Version einer Erweiterung aufgeführt ist.
Wenn im Update-Manifest eine neuere Version als die installierte Version 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 werden.
Update-URL
Erweiterungen, die auf Servern außerhalb des Chrome Web Store gehostet werden, müssen das update_url Feld in
ihrer manifest.json Datei enthalten.
{
"name": "My extension",
...
"update_url": "https://myhost.com/mytestextension/updates.xml",
...
}
Manifest aktualisieren
Das vom Server zurückgegebene Update-Manifest 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 ist an das von Omaha, der Update-Infrastruktur von Google, angelehnt. Das
Erweiterungssystem verwendet die folgenden Attribute für die <app> und <updatecheck> Elemente des
Update-Manifests:
- appid
- Die Erweiterungs-ID wird anhand eines Hashwerts des öffentlichen Schlüssels generiert, wie unter Paket beschrieben. Die ID einer Erweiterung wird auf der Seite „Erweiterungen verwalten“ angezeigt.
- codebase
- Eine HTTPS-URL zur
.crx-Datei. - version
- Wird vom Client verwendet, um zu bestimmen, ob die durch
codebaseangegebene.crx-Datei heruntergeladen werden soll. Sie muss mit dem Wert von „version“ in dermanifest.json-Datei der.crx-Datei übereinstimmen.
Die XML-Datei des Update-Manifests kann Informationen zu mehreren Erweiterungen enthalten, indem mehrere
<app> Elemente eingefügt werden.
Test
Die Standardfrequenz für die Update-Prüfung beträgt mehrere Stunden. Sie können jedoch eine Aktualisierung erzwingen, indem Sie auf der Seite „Erweiterungen verwalten“ auf die Schaltfläche Erweiterungen jetzt aktualisieren klicken.

Dadurch werden Prüfungen für alle installierten Erweiterungen gestartet.
Erweiterte Nutzung: Anfrageparameter
Der grundlegende Mechanismus für automatische Updates ist so konzipiert, dass die serverseitige Arbeit so einfach wie möglich ist. Sie müssen lediglich eine statische XML-Datei auf einen beliebigen einfachen Webserver wie Apache hochladen und diese XML-Datei aktualisieren, wenn neue Erweiterungsversionen veröffentlicht werden.
Entwickler, die mehrere Erweiterungen hosten, können Anfrageparameter prüfen, die die Erweiterungs-ID und die Version in der Update-Anfrage angeben. Wenn diese Parameter enthalten sind, können Erweiterungen über dieselbe URL aktualisiert werden, indem dynamischer serverseitiger Code anstelle einer statischen XML-Datei ausgeführt wird.
Das Format der Anfrageparameter ist:
?x=EXTENSION_DATA
Dabei ist EXTENSION_DATA ein URL-codierter String im folgenden Format:
id=EXTENSION_ID&v=EXTENSION_VERSION
Beispiel: Zwei Erweiterungen verweisen auf dieselbe Update-URL (https://test.com/extension_updates.php):
- Erweiterung 1
- ID: „aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa“
- Version: „1.1“
- Erweiterung 2
- ID: „bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb“
- Version: „0.4“
Die Anfrage zum Aktualisieren der einzelnen Erweiterungen wäre:
https://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1
und
https://test.com/extension_updates.php?x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4
Mehrere Erweiterungen können in einer einzigen Anfrage für jede eindeutige Update-URL aufgeführt werden. Wenn im vorherigen Beispiel ein Nutzer beide Erweiterungen installiert hat, werden die beiden Anfragen zu einer einzigen 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, die dieselbe Update-URL verwenden, so groß ist, dass eine GET-Anfrage-URL zu lang ist (über 2.000 Zeichen), werden bei der Update-Prüfung nach Bedarf zusätzliche GET-Anfragen gesendet.
Erweiterte Nutzung: Mindestversion des Browsers
Wenn dem Erweiterungssystem weitere APIs hinzugefügt werden, wird möglicherweise eine aktualisierte Version einer Erweiterung veröffentlicht, die nur mit neueren Versionen des Browsers funktioniert. Google Chrome wird zwar automatisch aktualisiert, es kann jedoch einige Tage dauern, bis die Mehrheit der Nutzer auf eine bestimmte neue Version aktualisiert hat. Wenn Sie
sicherstellen möchten, dass ein bestimmtes Update nur für Google Chrome-Versionen ab einer bestimmten
Version gilt, fügen Sie das Attribut „prodversionmin“ zum <app> Element in der Update-Antwort 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>
So wird sichergestellt, dass Nutzer nur dann automatisch auf Version 2 aktualisiert werden, wenn sie Google Chrome 3.0.193.0 oder höher verwenden.