Selfhost für Linux

Linux ist die einzige Plattform, auf der Chrome-Nutzer Erweiterungen installieren können, die außerhalb des Chrome Web Stores gehostet werden. In diesem Artikel wird beschrieben, wie Sie crx-Dateien auf einem allgemeinen Webserver verpacken, hosten und aktualisieren können. Wenn Sie eine Erweiterung oder ein Design ausschließlich über den Chrome Web Store vertreiben, lesen Sie den Artikel zum Hosting und Aktualisieren im Web Store.

Paket

Erweiterungen und Designs werden als .crx-Dateien bereitgestellt. Beim Upload über das Entwickler-Dashboard von Google Chrome wird im Dashboard automatisch die Datei crx erstellt. Wenn die Datei crx auf einem persönlichen Server veröffentlicht wird, muss sie lokal erstellt oder aus dem Chrome Web Store heruntergeladen werden.

CRX aus dem Chrome Web Store herunterladen

Wenn eine Erweiterung im Chrome Web Store gehostet wird, kann die Datei .crx ü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 das Paket herunterzuladen.

CRX-Datei aus dem Entwickler-Dashboard herunterladen

Die heruntergeladene Datei kann auf einem persönlichen Server gehostet werden. Dies ist die sicherste Methode, eine Erweiterung lokal zu hosten, da die Inhalte der Erweiterung vom Chrome Web Store signiert werden. Dies hilft dabei, potenzielle Angriffe und Manipulationen zu erkennen.

CRX lokal erstellen

Erweiterungsverzeichnisse werden auf der Seite zur Verwaltung von Erweiterungen 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 zur Verwaltung von Erweiterungen den Entwicklermodus, indem Sie auf die Ein/Aus-Schaltfläche neben Entwicklermodus klicken. Klicken Sie dann auf die Schaltfläche PACK ERWEITERUNG.

„Entwicklermodus“ aktiviert ist, dann „Click Pack-Erweiterung“.

Geben Sie im Feld „Stammverzeichnis der Erweiterung“ den Pfad zum Ordner der Erweiterung an und klicken Sie dann auf die Schaltfläche ERWEITERUNG. Ignorieren Sie bei einem erstmaligen Paket das Feld Privater Schlüssel.

Geben Sie den Erweiterungspfad und dann die Klickpaket-Erweiterung an

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

Gepackte Erweiterungsdateien

Verlieren Sie nicht den privaten Schlüssel. Bewahren Sie die Datei .pem an einem geheim und sicheren Ort auf. Dazu muss die Erweiterung aktualisiert werden.

CRX-Paket aktualisieren

Aktualisiere die .crx-Datei einer Erweiterung, indem du die Versionsnummer in manifest.json erhöhen.

{
  ...
  "version": "1.5",
  ...
  }
}
{
  ...
  "version": "1.6",
  ...
  }
}

Kehren Sie zur Verwaltungsseite für Erweiterungen zurück und klicken Sie auf die Schaltfläche Paketerweiterung. Geben Sie den Pfad zum Verzeichnis für die Erweiterungen und den Speicherort des privaten Schlüssels an.

Erweiterungsdateien aktualisieren

Die Seite enthält den Pfad für die aktualisierte gepackte Erweiterung.

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 .crx-Dateien gehostet werden, muss geeignete HTTP-Header verwenden, damit Nutzer die Erweiterung durch Klicken auf einen Link installieren können.

Für Google Chrome gilt eine Datei als installierbar, wenn eine der folgenden Bedingungen zutrifft:

  • Die Datei hat den Inhaltstyp application/x-chrome-extension.
  • Das Dateisuffix lautet .crx und beide der folgenden Bedingungen sind erfüllt:
    • Die Datei wird nicht mit dem HTTP-Header X-Content-Type-Options: nosniff bereitgestellt
    • Die Datei wird mit einem der folgenden Inhaltstypen bereitgestellt:
    • Leerer String
    • "text/plain"
    • "application/octet-stream"
    • "unknown/unknown"
    • "application/unknown"
    • "\*/\*"

Der häufigste Grund dafür, dass eine installierbare Datei nicht erkannt wird, ist, dass der Server den Header X-Content-Type-Options: nosniff sendet. Der zweithäufigste Grund ist, dass der Server einen unbekannten Inhaltstyp sendet, der nicht in der vorherigen Liste enthalten ist. Um ein HTTP-Header-Problem zu beheben, ändern Sie entweder die Konfiguration des Servers oder hosten Sie die .crx-Datei auf einem anderen Server.

Aktualisieren

Alle paar Stunden prüft der Browser, ob installierte Erweiterungen eine Update-URL haben. Für jede Anfrage wird eine Anfrage an die betreffende URL gestellt und nach einer Manifest-XML-Datei für die Aktualisierung gesucht.

  • Der von einer Updateprüfung zurückgegebene Inhalt ist ein XML-Dokument mit dem Update-Manifest, in dem die neueste Version einer Erweiterung aufgeführt ist.

Wenn im Updatemanifest eine neuere Version als installiert 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 sein.

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

URL aktualisieren

Für Erweiterungen, die auf Servern außerhalb des Chrome Web Stores gehostet werden, muss das Feld update_url in der Datei manifest.json enthalten sein.

{
  "name": "My extension",
  ...
  "update_url": "https://myhost.com/mytestextension/updates.xml",
  ...
}

Manifest aktualisieren

Das vom Server zurückgegebene Manifest für die Aktualisierung 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, der Update-Infrastruktur von Google, übernommen. 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 im Abschnitt Verpackung beschrieben. Die ID einer Erweiterung wird auf der Seite „Erweiterungsverwaltung“ 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. Sie sollte mit dem Wert von „version“ in der Datei manifest.json der Datei .crx übereinstimmen.

Die XML-Datei des Aktualisierungsmanifests kann durch Angabe mehrerer <app>-Elemente Informationen zu mehreren Erweiterungen enthalten.

Testen

Standardmäßig wird ein Update über mehrere Stunden durchgeführt. Über die Schaltfläche Erweiterungen jetzt aktualisieren auf der Seite zur Verwaltung von Erweiterungen können Sie jedoch ein Update erzwingen.

Erweiterungen jetzt aktualisieren

Dadurch wird eine Prüfung auf alle installierten Erweiterungen gestartet.

Erweiterte Verwendung: Anfrageparameter

Der grundlegende Mechanismus für automatische Updates wurde so konzipiert, dass die serverseitige Arbeit so einfach ist wie das Ablegen einer statischen XML-Datei auf einen einfachen Webserver wie Apache und das Aktualisieren dieser XML-Datei, sobald neue Erweiterungsversionen veröffentlicht werden.

Entwickler, die mehrere Erweiterungen hosten, können Anfrageparameter prüfen, die in der Aktualisierungsanfrage die Erweiterungs-ID und Version angeben. Mit diesen Parametern können Erweiterungen von derselben URL aktualisiert werden, auf der dynamischer serverseitiger Code anstatt 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

So verweisen beispielsweise zwei Erweiterungen auf dieselbe Update-URL (https://test.com/extension_updates.php):

  • Erweiterung 1
    • ID: „aaaaaaaaaaaaaaaaaaaaaaaaaaaaa“
    • Version: „1.1“
  • Erweiterung 2
    • ID: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
    • Version: „0.4“

Die Anfrage zum Aktualisieren der einzelnen Erweiterungen lautet:

https://test.com/extension_updates.php?x=id%3Daaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%26v%3D1.1

sowie

https://test.com/extension_updates.php?x=id%3Dbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb%26v%3D0.4

In einer Anfrage können für jede einzelne Update-URL mehrere Erweiterungen aufgeführt werden. Wenn im vorherigen Beispiel ein Nutzer beide Erweiterungen installiert hat, werden die beiden Anfragen zu einer 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 mit derselben Update-URL so groß ist, dass eine GET-Anfrage-URL zu lang ist (mehr als 2.000 Zeichen), gibt die Updateprüfung bei Bedarf zusätzliche GET-Anfragen aus.

Erweiterte Nutzung: erforderliche Browserversion

Wenn dem Erweiterungssystem weitere APIs hinzugefügt werden, wird unter Umständen eine aktualisierte Version einer Erweiterung veröffentlicht, die nur mit neueren Versionen des Browsers funktioniert. Google Chrome selbst wird zwar automatisch aktualisiert, es kann jedoch einige Tage dauern, bis der Großteil der Nutzer auf eine neue Version aktualisiert ist. Damit ein bestimmtes Update nur auf Google Chrome-Versionen angewendet wird, die mindestens einer bestimmten Version entsprechen, fügen Sie dem Element <app> in der Updateantwort 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 aktualisiert werden, wenn sie Google Chrome 3.0.193.0 oder höher verwenden.