Selfhost für Linux

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.

.crx-Datei aus dem Entwickler-Dashboard herunterladen

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.

Wenn der Entwicklermodus aktiviert ist, klicken Sie auf „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.

Geben Sie den Erweiterungspfad an und klicken Sie auf „Erweiterung packen“.

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

Gepackte Erweiterungsdateien

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.

Erweiterungsdateien aktualisieren

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

Erweiterungsdateien aktualisieren

Ü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 .crx und 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"
    • "\*/\*"

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.

Hinweis:Um den Datenschutz für Nutzer zu schützen, sendet Google Chrome keine Cookie-Header mit Anfragen für automatische Update-Manifeste und ignoriert alle Set-Cookie-Header in den Antworten auf diese Anfragen.

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 codebase angegebene .crx-Datei heruntergeladen werden soll. Sie muss mit dem Wert von „version“ in der manifest.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.

Erweiterungen jetzt aktualisieren

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.