Selfhost für Linux

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.

CRX-Datei aus dem Entwickler-Dashboard herunterladen

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.

Entwicklermodus ist aktiviert und dann auf „Erweiterung packen“ klicken

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.

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

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

Paketierte Erweiterungsdateien

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.

Erweiterungsdateien aktualisieren

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

Erweiterungsdateien aktualisieren

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

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.

Hinweis: Aus Datenschutzgründen sendet Google Chrome keine Cookie-Header mit Manifest-Anfragen für automatische Updates und ignoriert alle Set-Cookie-Header in den Antworten auf diese Anfragen.

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 Datei manifest.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.

Erweiterungen jetzt aktualisieren

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.