Zelfhost voor Linux

Linux is het enige platform waarop Chrome-gebruikers extensies kunnen installeren die niet via de Chrome Web Store worden gehost. Dit artikel beschrijft hoe u crx -bestanden kunt verpakken, hosten en bijwerken vanaf een algemene webserver. Als u een extensie of thema uitsluitend via de Chrome Web Store distribueert, raadpleeg dan het artikel over hosting en bijwerken in de Web Store .

Pakket

Extensies en thema's worden aangeboden als .crx bestanden. Bij het uploaden via het Chrome Developer Dashboard wordt het crx bestand automatisch aangemaakt. Als de applicatie op een persoonlijke server wordt gepubliceerd, moet het crx bestand lokaal worden aangemaakt of gedownload vanuit de Chrome Web Store.

Download het .crx-bestand vanuit de Chrome Web Store.

Als een extensie in de Chrome Web Store wordt gehost, 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 het bestand te downloaden.

Download het .crx-bestand via het ontwikkelaarsdashboard.

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

Maak lokaal een .crx-bestand aan.

Extensiemappen worden op de pagina Extensiebeheer omgezet naar .crx bestanden. Ga naar chrome://extensions/ in de adresbalk of klik op het Chrome-menu, houd de muiswijzer boven 'Meer tools' en selecteer 'Extensies'.

Schakel op de pagina Extensiebeheer de ontwikkelaarsmodus in door op de schakelaar naast 'Ontwikkelaarsmodus' te klikken. Selecteer vervolgens de knop 'EXTENSIE INPAKKEN' .

Schakel de ontwikkelaarsmodus in en klik vervolgens op 'Extensie inpakken'.

Geef het pad naar de map van de extensie op in het veld 'Extension root directory' en klik vervolgens op de knop 'PACK EXTENSION' . Negeer het veld 'Private key' bij een eerste keer verpakken.

Geef het extensiepad op en klik vervolgens op 'Extensie inpakken'.

Chrome maakt twee bestanden aan: 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 plek; u heeft het nodig om de extensie bij te werken .

Een .crx-pakket bijwerken

Werk het .crx -bestand van een extensie bij door het versienummer in manifest.json te verhogen.

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

Ga terug naar de pagina Extensiebeheer en klik op de knop EXTENSIE INPAKKEN . Geef het pad naar de extensiemap en de locatie van de privésleutel op.

Extensiebestanden bijwerken

Op deze pagina vindt u het pad naar de bijgewerkte extensie.

Extensiebestanden bijwerken

Pakket via de commandoregel

Verpak extensies via de commandoregel door chrome.exe aan te roepen. Gebruik de vlag --pack-extension om de locatie van de extensiemap 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 om gebruikers in staat te stellen de extensie te installeren door op een link te klikken.

Google Chrome beschouwt een bestand als installeerbaar als aan een van de volgende voorwaarden is voldaan:

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

De meest voorkomende reden waarom een ​​installeerbaar bestand niet wordt herkend, is dat de server de header X-Content-Type-Options: nosniff verzendt. De op één na meest voorkomende reden is dat de server een onbekend contenttype verzendt – een type dat niet in de bovenstaande lijst staat. Om een ​​probleem met een HTTP-header op te lossen, kunt u de serverconfiguratie wijzigen of proberen het .crx bestand op een andere server te hosten.

Update

De browser controleert elke paar uur de geïnstalleerde extensies op een update-URL. Voor elke extensie stuurt de browser een verzoek naar die URL om te zoeken naar een XML-manifestbestand met een update.

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

Als in het updatemanifest een versie wordt vermeld die nieuwer 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.

Let op: om de privacy van gebruikers te waarborgen, verzendt Google Chrome geen cookie-headers met verzoeken om het manifest automatisch bij te werken en negeert het alle Set-Cookie-headers in de reacties op die verzoeken.

Update-URL

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

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

Manifest bijwerken

Het updatemanifest dat door de server wordt teruggestuurd, 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 overgenomen van het formaat dat gebruikt wordt door Omaha , de update-infrastructuur van Google. Het extensiesysteem gebruikt de volgende attributen voor de <app> en <updatecheck> elementen van het updatemanifest:

appid
De extensie-ID wordt gegenereerd op basis van een hash van de publieke sleutel, zoals beschreven in de documentatie over het verpakken . De ID van een extensie wordt weergegeven op de pagina Extensies beheren.
codebase
Een HTTPS-URL naar het .crx bestand.
versie
Wordt door de client gebruikt om te bepalen of het .crx bestand, gespecificeerd door codebase , gedownload moet worden. De waarde moet overeenkomen met de waarde van "version" in het manifest.json bestand van het .crx bestand.

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

Testen

De standaardfrequentie voor het controleren op updates is enkele uren, maar een update kan worden geforceerd met de knop 'Extensies nu bijwerken' op de pagina 'Extensies beheren'.

Update extensies nu

Hiermee worden alle geïnstalleerde extensies gecontroleerd.

Geavanceerd gebruik: verzoekparameters

Het basismechanisme voor automatische updates is ontworpen om het serverwerk zo eenvoudig mogelijk te maken: je hoeft alleen maar een statisch XML-bestand op een willekeurige webserver, zoals Apache, te plaatsen en dat XML-bestand bij te werken zodra er nieuwe versies van de extensie beschikbaar komen.

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

De aanvraagparameters hebben de volgende structuur:

?x=EXTENSION_DATA

Waarbij EXTENSION_DATA een URL-gecodeerde tekenreeks is in de volgende 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: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
    • Versie: "0.4"

Het verzoek om elke afzonderlijke extensie bij te werken zou als volgt luiden:

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. In het vorige voorbeeld worden de twee verzoeken samengevoegd tot één verzoek als een gebruiker beide extensies heeft geïnstalleerd.

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 wordt (meer dan 2000 tekens), verstuurt de updatecontrole indien nodig extra GET-verzoeken.

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 werkt met nieuwere versies van de browser. Hoewel Google Chrome zelf automatisch wordt bijgewerkt, kan het een paar dagen duren voordat de meeste gebruikers een bepaalde nieuwe versie hebben geïnstalleerd. Om ervoor te zorgen dat een update alleen van toepassing is op Google Chrome-versies van een specifieke versie of hoger, voegt u het attribuut "prodversionmin" toe aan het <app> -element in het updatebericht.

<?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 zorgt ervoor dat gebruikers alleen automatisch naar versie 2 updaten als ze Google Chrome 3.0.193.0 of hoger gebruiken.