Linux ist die einzige Plattform, auf der Chrome-Nutzer Erweiterungen installieren können, die außerhalb des Chrome Web Store gehostet werden. In diesem Artikel wird beschrieben, wie Sie crx
-Dateien von einem Webserver für allgemeine Zwecke verpacken, hosten und aktualisieren. Wenn Sie eine Erweiterung oder ein Design ausschließlich über den Chrome Web Store anbieten, lesen Sie den Hilfeartikel Webstore-Hosting und -Aktualisierung.
Paket
Erweiterungen und Designs werden als .crx
-Dateien bereitgestellt. Wenn Sie die Datei über das Chrome-Entwickler-Dashboard hochladen, wird die crx
-Datei automatisch vom Dashboard erstellt. Wenn die App auf einem privaten 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 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 es herunterzuladen.
Die heruntergeladene Datei kann auf einem privaten Server gehostet werden. Das ist die sicherste Methode, eine Erweiterung lokal zu hosten, da der Inhalt der Erweiterung vom Chrome Web Store signiert wird. So können potenzielle Angriffe und Manipulationen erkannt werden.
.crx-Datei lokal erstellen
Erweiterungsverzeichnisse werden auf der Seite „Erweiterungen verwalten“ 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 „Erweiterungen verwalten“ den Entwicklermodus, indem Sie auf den Schalter neben Entwicklermodus klicken. Klicken Sie dann auf die Schaltfläche ERWEITERUNG VERpacken.
Geben Sie im Feld „Erweiterungsstammverzeichnis“ den Pfad zum Ordner der Erweiterung an und klicken Sie dann auf die Schaltfläche ERWEITERUNG VERPACKEN. Ignorieren Sie das Feld Privater Schlüssel für ein Erstpaket.
Chrome erstellt zwei Dateien, eine .crx
-Datei und eine .pem
-Datei, die den privaten Schlüssel der Erweiterung enthält.
Bewahren Sie den privaten Schlüssel gut auf. Bewahren Sie die Datei .pem
geheim und sicher auf. Dazu muss die Erweiterung aktualisiert werden.
.crx-Paket aktualisieren
Aktualisieren Sie die Datei .crx
einer Erweiterung, indem Sie die Versionsnummer in manifest.json
erhöhen.
{
...
"version": "1.5",
...
}
}
{
...
"version": "1.6",
...
}
}
Kehren Sie zur Seite für die Verwaltung von Erweiterungen zurück und klicken Sie auf die Schaltfläche ERWEITERUNG PAKIEREN. 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 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 Sie .crx
-Dateien hosten, 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 Dateisuffix ist
.crx
und beide der folgenden Bedingungen treffen zu:- Die Datei wird nicht mit dem HTTP-Header
X-Content-Type-Options: nosniff
ausgeliefert. - Die Datei hat einen der folgenden Inhaltstypen:
- 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, dass der Server einen unbekannten Inhaltstyp sendet, der nicht in der vorherigen Liste enthalten ist. 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
Alle paar Stunden sucht der Browser in den installierten Erweiterungen nach einer Update-URL. Für jede davon wird eine Anfrage an diese URL 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, das die neueste Version einer Erweiterung enthält.
Wenn im Update-Manifest eine Version erwähnt wird, die neuer ist als die installierte, 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.
URL aktualisieren
Erweiterungen, die auf Servern außerhalb des Chrome Web Store gehostet werden, müssen das Feld update_url
in der Datei manifest.json
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 wurde von Omaha übernommen, der Update-Infrastruktur von Google. 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 unter Verpackung beschrieben. Die ID einer Erweiterung wird auf der Seite zur Verwaltung von Erweiterungen angezeigt.
- Codebasis
- Eine HTTPS-URL zur
.crx
-Datei. - Version
- Wird vom Client verwendet, um zu ermitteln, ob die mit
codebase
angegebene.crx
-Datei heruntergeladen werden soll. Er muss mit dem Wert „version“ in der Dateimanifest.json
der Datei.crx
übereinstimmen.
Die XML-Datei des Update-Manifests kann Informationen zu mehreren Erweiterungen enthalten, wenn mehrere <app>
-Elemente enthalten sind.
Test
Die Standardaktualisierungshäufigkeit beträgt mehrere Stunden. Sie können eine Aktualisierung jedoch über die Schaltfläche Erweiterungen jetzt aktualisieren auf der Seite „Erweiterungen verwalten“ erzwingen.
Dadurch wird die Überprüfung aller installierten Erweiterungen gestartet.
Erweiterte Verwendung: Anfrageparameter
Der grundlegende Mechanismus für automatische Updates soll die serverseitige Arbeit so einfach wie möglich machen. Dazu wird eine statische XML-Datei einfach auf einen beliebigen Webserver wie Apache abgelegt und bei der Veröffentlichung neuer Erweiterungsversionen aktualisiert.
Entwickler, die mehrere Erweiterungen hosten, können Anfrageparameter prüfen, die die Erweiterungs-ID und ‑version in der Aktualisierungsanfrage angeben. Wenn du diese Parameter verwendest, können Erweiterungen über dieselbe URL aktualisiert werden, wenn dynamischer serverseitiger Code statt 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: „aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa“
- Version: „1.1“
- Zusatzoption 2
- ID: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
- Version: „0.4“
Die Anfrage zum Aktualisieren jeder einzelnen Erweiterung würde so lauten:
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
In einer einzelnen Anfrage können mehrere Erweiterungen für jede eindeutige Update-URL aufgeführt werden. Wenn ein Nutzer im vorherigen Beispiel beide Erweiterungen installiert hat, werden die beiden Anfragen in eine einzige 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, groß genug ist, dass eine GET-Anfrage-URL zu lang ist (über 2.000 Zeichen), gibt die Updateprüfung bei Bedarf zusätzliche GET-Anfragen aus.
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 selbst wird automatisch aktualisiert. Es kann jedoch einige Tage dauern, bis die Mehrheit der Nutzer auf eine neue Version umgestiegen ist. Wenn ein bestimmtes Update nur für Google Chrome-Versionen ab einer bestimmten Version gelten soll, fügen Sie dem <app>
-Element in der Update-Antwort 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 aktualisieren, wenn sie Google Chrome 3.0.193.0 oder höher verwenden.