Zelfhost voor Linux

Linux is het enige platform waarop Chrome-gebruikers extensies kunnen installeren die buiten de Chrome Web Store worden gehost. In dit artikel wordt beschreven hoe u crx bestanden vanaf een algemene webserver kunt verpakken, hosten en bijwerken. Als u een extensie of thema uitsluitend via de Chrome Web Store distribueert, raadpleeg dan Webstore hosting en updates .

Pakket

Extensies en thema's worden aangeboden als .crx bestanden. Wanneer u uploadt via het Chrome Developer Dashboard , maakt het dashboard automatisch het crx bestand aan. Als het crx bestand op een persoonlijke server wordt gepubliceerd, moet het lokaal worden gemaakt of worden gedownload via de Chrome Web Store.

Download .crx uit de Chrome Web Store

Als een extensie wordt gehost in de Chrome Web Store, kan het .crx bestand worden gedownload via het ontwikkelaarsdashboard. Zoek de extensie onder 'Uw vermeldingen' en klik op 'Meer informatie'. Klik in het pop-upvenster op de blauwe link main.crx om deze te downloaden.

Download .crx van het ontwikkelaarsdashboard

Het gedownloade bestand kan worden gehost op een persoonlijke server. Dit is de veiligste manier om een ​​extensie lokaal te hosten, aangezien de inhoud van de extensie wordt ondertekend door de Chrome Web Store. Dit helpt bij het detecteren van potentiële aanvallen en geknoei.

Maak lokaal .crx

Extensiemappen worden geconverteerd naar .crx bestanden op de Extensiebeheerpagina. Navigeer naar chrome://extensions/ in de omnibox, of klik op het Chrome-menu, houd de aanwijzer boven 'Meer tools' en selecteer vervolgens 'Extensies'.

Schakel op de pagina Extensiebeheer de ontwikkelaarsmodus in door op de tuimelschakelaar naast Ontwikkelaarsmodus te klikken. Selecteer vervolgens de knop PACK EXTENSION .

Ontwikkelaarsmodus is aangevinkt en klik vervolgens op Extensie inpakken

Geef het pad naar de map van de extensie op in het veld Extensiehoofdmap en klik vervolgens op de knop PACK EXTENSION . Negeer het veld Privésleutel voor een nieuw pakket.

Geef het extensiepad op en klik vervolgens op Extensie inpakken

Chrome maakt twee bestanden, een .crx bestand en een .pem bestand, dat de privésleutel van de extensie bevat.

Verpakte extensiebestanden

Verlies de privésleutel niet! Bewaar het .pem bestand op een geheime en veilige plaats; het zal nodig zijn om de extensie bij te werken .

Update een .crx-pakket

Update het .crx bestand van een extensie door het versienummer in manifest.json te verhogen.

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

Keer terug naar de Extensiebeheerpagina en klik op de knop PACK EXTENSION . Geef het pad naar de map met extensies en de locatie van de persoonlijke sleutel op.

Extensiebestanden bijwerken

De pagina geeft het pad voor de bijgewerkte verpakte extensie weer.

Extensiebestanden bijwerken

Verpakken via de opdrachtregel

Verpak extensies op de opdrachtregel door chrome.exe aan te roepen. Gebruik de vlag --pack-extension om de locatie van de map van de extensie op te geven en de vlag --pack-extension-key om de locatie van het privésleutelbestand van de extensie op te geven.

chrome.exe --pack-extension=C:\myext --pack-extension-key=C:\myext.pem

Gastheer

Een server die .crx bestanden host, moet de juiste HTTP-headers gebruiken zodat gebruikers de extensie kunnen installeren door op een link te klikken.

Google Chrome beschouwt een bestand als installeerbaar als een van de volgende situaties van toepassing is:

  • Het bestand heeft het inhoudstype application/x-chrome-extension
  • Het bestandsachtervoegsel is .crx en beide volgende zijn waar:
    • Het bestand wordt niet aangeboden met de HTTP-header X-Content-Type-Options: nosniff
    • Het bestand wordt geleverd met een van de volgende inhoudstypen:
    • lege tekenreeks
    • "text/plain"
    • "application/octet-stream"
    • "unknown/unknown"
    • "application/unknown"
    • "\*/\*"

De meest voorkomende reden voor het niet herkennen van een installeerbaar bestand is dat de server de header X-Content-Type-Options: nosniff verzendt. De tweede meest voorkomende reden is dat de server een onbekend inhoudstype verzendt, een type dat niet in de vorige lijst staat. Om een ​​HTTP-headerprobleem op te lossen, wijzigt u de configuratie van de server of probeert u het .crx bestand op een andere server te hosten.

Update

Elke paar uur controleert de browser geïnstalleerde extensies op een update-URL. Voor elke URL wordt een verzoek ingediend bij de URL, op zoek naar een XML-updatemanifestbestand.

  • De inhoud die door een updatecontrole wordt geretourneerd, is een XML-document met een updatemanifest waarin de nieuwste versie van een extensie wordt vermeld.

Als het updatemanifest een versie vermeldt die recenter is dan de geïnstalleerde versie, downloadt en installeert de browser de nieuwe versie. Net als bij handmatige updates moet het nieuwe .crx bestand worden ondertekend met dezelfde privésleutel als de momenteel geïnstalleerde versie.

Opmerking: om de privacy van gebruikers te behouden, verzendt Google Chrome geen Cookie-headers met manifestverzoeken voor automatische updates, en negeert het eventuele Set-Cookie-headers in de reacties op deze verzoeken.

Update-URL

Extensies die worden gehost op servers buiten de Chrome Webstore moeten het veld update_url in hun manifest.json bestand bevatten.

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

Update manifest

Het updatemanifest dat door de server wordt geretourneerd, moet een XML-document zijn.

<?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>

Dit XML-formaat is ontleend aan het formaat dat wordt gebruikt door Omaha , de update-infrastructuur van Google. Het extensiesysteem gebruikt de volgende kenmerken voor de <app> en <updatecheck> -elementen van het updatemanifest:

appid
De extensie-ID wordt gegenereerd op basis van een hash van de openbare sleutel, zoals beschreven in package . De ID van een extensie wordt weergegeven op de pagina Extensiebeheer.
codebasis
Een HTTPS-URL naar het .crx bestand.
versie
Wordt door de client gebruikt om te bepalen of het door codebase gespecificeerde .crx bestand moet worden gedownload. Het moet overeenkomen met de waarde van 'version' in het manifest.json -bestand van het .crx bestand.

Het XML-bestand van het updatemanifest kan informatie bevatten over meerdere extensies door meerdere <app> -elementen op te nemen.

Testen

De standaardfrequentie voor updatecontrole is enkele uren, maar een update kan worden geforceerd met behulp van de knop Extensies nu bijwerken op de pagina Extensiebeheer.

Extensies nu bijwerken

Hierdoor worden de controles voor alle geïnstalleerde extensies gestart.

Geavanceerd gebruik: parameters opvragen

Het basismechanisme voor automatisch bijwerken is ontworpen om het werk op de server net zo eenvoudig te maken als het plaatsen van een statisch XML-bestand op een gewone webserver, zoals Apache, en het bijwerken van dat XML-bestand zodra er nieuwe extensieversies worden uitgebracht.

Ontwikkelaars die meerdere extensies hosten, kunnen de aanvraagparameters controleren, die de extensie-ID en -versie in het updateverzoek aangeven. Door deze parameters op te nemen, kunnen extensies worden bijgewerkt vanaf dezelfde URL met dynamische code aan de serverzijde in plaats van een statisch XML-bestand.

Het formaat van de aanvraagparameters is:

?x=EXTENSION_DATA

Waar EXTENSION_DATA een URL-gecodeerde tekenreeks is met de indeling:

id=EXTENSION_ID&v=EXTENSION_VERSION

Twee extensies verwijzen bijvoorbeeld naar dezelfde update-URL ( https://test.com/extension_updates.php ):

  • Uitbreiding 1
    • ID: "aaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    • Versie: "1.1"
  • Uitbreiding 2
    • ID: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
    • Versie: "0.4"

Het verzoek om elke individuele extensie bij te werken zou zijn:

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

En

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

Voor elke unieke update-URL kunnen meerdere extensies in één verzoek worden vermeld. Als in het vorige voorbeeld een gebruiker beide extensies heeft geïnstalleerd, worden de twee verzoeken samengevoegd tot één verzoek:

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

Als het aantal geïnstalleerde extensies dat dezelfde update-URL gebruikt zo groot is dat een GET-verzoek-URL te lang is (meer dan 2000 tekens of zo), geeft de updatecontrole zo nodig aanvullende GET-verzoeken uit.

Geavanceerd gebruik: minimale browserversie

Naarmate er meer API's aan het extensiesysteem worden toegevoegd, kan er een bijgewerkte versie van een extensie worden uitgebracht die alleen met nieuwere versies van de browser werkt. Hoewel Google Chrome zelf automatisch wordt bijgewerkt, kan het een paar dagen duren voordat het merendeel van het gebruikersbestand is bijgewerkt naar een bepaalde nieuwe release. Om ervoor te zorgen dat een bepaalde update alleen van toepassing is op Google Chrome-versies van of hoger dan een specifieke versie, voegt u het kenmerk 'prodversionmin' toe aan het <app> -element in het updateantwoord.

<?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>

Dit zou ervoor zorgen dat gebruikers alleen automatisch naar versie 2 zouden updaten als ze Google Chrome 3.0.193.0 of hoger gebruiken.