Erweiterungen, die nicht im Chrome Web Store gehostet werden, können nur von Linux-Nutzern installiert werden. In diesem Artikel wird beschrieben, wie Sie .crx-Dateien von einem persönlichen Server verpacken, hosten und aktualisieren. Wenn Sie eine Erweiterung oder ein Design ausschließlich über den Chrome Web Store vertreiben, lesen Sie den Abschnitt Webstore Hosting and Updating (Hosting und Aktualisierung im Web Store).
Verpackung
Erweiterungen und Designs werden als .crx-Dateien bereitgestellt. Wenn Sie die Datei über das Chrome Developer Dashboard hochladen , wird die .crx-Datei automatisch erstellt. Wenn die Datei auf einem persönlichen Server veröffentlicht wird, 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 über das 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 persönlichen Server gehostet werden. Das 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. Geben Sie chrome://extensions/ in die Omnibox ein 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 PACK EXTENSION (PAKETERWEITERUNG).

Geben Sie den Pfad zum Ordner der Erweiterung im Feld „Extension root directory“ (Stammverzeichnis der Erweiterung) an und klicken Sie dann auf die Schaltfläche PACK EXTENSION (ERWEITERUNG PACKEN). Ignorieren Sie das Feld Private key für ein Erstpaket.

In Chrome werden zwei Dateien erstellt: 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 Datei .pem 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 zur Erweiterungsverwaltung 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 für die aktualisierte gepackte Erweiterung angezeigt.

Ü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
Hosting
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 Bedingungen sind erfüllt:- Die Datei wird nicht mit dem HTTP-Header
X-Content-Type-Options: nosniffbereitgestellt. - 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
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.
Wird aktualisiert
Der Browser sucht alle paar Stunden in den installierten Erweiterungen nach einer Update-URL. Für jede URL wird eine Anfrage gesendet, um nach einer XML-Datei mit einem Update-Manifest zu suchen.
- Der Inhalt, der von 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 signiert werden wie die aktuell installierte Version.
Update-URL
Erweiterungen, die auf Servern außerhalb des Chrome Web Store gehostet werden, müssen das Feld update_url 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 stammt von Omaha, der Update-Infrastruktur von Google. Das Erweiterungssystem verwendet die folgenden Attribute für die Elemente <app> und <updatecheck> des Aktualisierungsmanifests:
| appid | Die Erweiterungs-ID wird anhand eines Hash des öffentlichen Schlüssels generiert, wie unter Verpackung beschrieben. Die ID einer Erweiterung wird auf der Seite zur Verwaltung von Erweiterungen 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. Er sollte mit dem Wert von „version“ in der Datei manifest.json der Datei .crx übereinstimmen. |
Die XML-Datei des Aktualisierungsmanifests kann Informationen zu mehreren Erweiterungen enthalten, indem mehrere <app>-Elemente eingefügt werden.
Test
Die Standardhäufigkeit für die Updateprüfung beträgt mehrere Stunden. Ein Update kann jedoch über die Schaltfläche Erweiterungen jetzt aktualisieren auf der Seite „Erweiterungsverwaltung“ erzwungen werden.

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 ist, dass Sie nur eine statische XML-Datei auf einen beliebigen einfachen Webserver wie Apache hochladen und diese XML-Datei aktualisieren müssen, wenn neue Erweiterungsversionen veröffentlicht werden.
Entwickler, die mehrere Erweiterungen hosten, können die Anfrageparameter prüfen, die die Erweiterungs-ID und die Version in der Aktualisierungsanfrage angeben. Durch die Einbeziehung dieser Parameter können Erweiterungen über dieselbe URL aktualisiert werden, auf der dynamischer serverseitiger Code anstelle 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
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
Für jede eindeutige Update-URL können mehrere Erweiterungen in einer einzelnen Anfrage aufgeführt werden. Wenn ein Nutzer im obigen Beispiel beide Erweiterungen installiert hat, werden die beiden Anfragen in 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 (etwa über 2.000 Zeichen), werden beim Update-Check nach Bedarf zusätzliche GET-Anfragen gesendet.
Erweiterte Nutzung: Mindestbrowserversion
Wenn dem Erweiterungssystem weitere APIs hinzugefügt werden, kann eine aktualisierte Version einer Erweiterung veröffentlicht werden, die nur mit neueren Versionen des Browsers funktioniert. Google Chrome wird zwar automatisch aktualisiert, es kann jedoch einige Tage dauern, bis die meisten Nutzer auf eine bestimmte neue Version aktualisiert haben. Wenn Sie dafür sorgen möchten, dass ein bestimmtes Update nur für Google Chrome-Versionen ab einer bestimmten Version gilt, fügen Sie der Update-Antwort das Attribut „prodversionmin“ zum
<?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.