Własny host w systemie Linux

Linux to jedyna platforma, na której użytkownicy Chrome mogą instalować rozszerzenia hostowane poza Chrome Web Store. Z tego artykułu dowiesz się, jak pakować, hostować i aktualizować pliki crx z ogólnego serwera WWW. Jeśli rozpowszechniasz rozszerzenie lub motyw wyłącznie za pomocą Chrome Web Store, zapoznaj się z artykułem Hostowanie i aktualizowanie w Chrome Web Store.

Pakiet

Rozszerzenia i motywy są udostępniane jako pliki .crx. Podczas przesyłania za pomocą Panelu dewelopera Chrome Dashboard plik crx jest tworzony automatycznie. Jeśli rozszerzenie jest opublikowane na serwerze osobistym, plik crx trzeba utworzyć lokalnie lub pobrać z Chrome Web Store.

Pobieranie pliku .crx z Chrome Web Store

Jeśli rozszerzenie jest hostowane w Chrome Web Store, plik .crx można pobrać z Panelu dewelopera. Znajdź rozszerzenie w sekcji „Twoje oferty” i kliknij „Więcej informacji”. W wyskakującym okienku kliknij niebieski link main.crx, aby pobrać plik.

Pobieranie pliku .crx z Panelu dewelopera

Pobrany plik można hostować na serwerze osobistym. Jest to najbezpieczniejszy sposób hostowania rozszerzenia lokalnie, ponieważ zawartość rozszerzenia będzie podpisana przez Chrome Web Store. Pomaga to wykrywać potencjalne ataki i manipulacje.

Tworzenie pliku .crx lokalnie

Katalogi rozszerzeń są konwertowane na pliki .crx na stronie zarządzania rozszerzeniami. W pasku adresu wpisz chrome://extensions/ lub kliknij Menu Chrome, najedź kursorem na „Więcej narzędzi” i wybierz „Rozszerzenia”.

Na stronie zarządzania rozszerzeniami włącz tryb programisty, klikając przełącznik obok opcji Tryb programisty. Następnie kliknij przycisk SPAKUJ ROZSZERZENIE.

Zaznaczony jest tryb programisty, a następnie kliknij Spakuj rozszerzenie.

W polu Katalog główny rozszerzenia określ ścieżkę do folderu rozszerzenia, a następnie kliknij przycisk SPAKUJ ROZSZERZENIE. W przypadku pierwszego pakietu zignoruj pole Klucz prywatny.

Określ ścieżkę rozszerzenia, a potem kliknij „Spakuj rozszerzenie”.

Chrome utworzy 2 pliki: .crx i .pem, który zawiera klucz prywatny rozszerzenia.

Spakowane pliki rozszerzeń

Nie zgub klucza prywatnego! Przechowuj plik .pem w bezpiecznym miejscu. Będzie on potrzebny do aktualizacji rozszerzenia.

Aktualizowanie pakietu .crx

Aby zaktualizować plik .crx rozszerzenia, zwiększ numer wersji w pliku manifest.json.

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

Wróć na stronę zarządzania rozszerzeniami i kliknij przycisk SPAKUJ ROZSZERZENIE. Określ ścieżkę do katalogu rozszerzeń i lokalizację klucza prywatnego.

Aktualizowanie plików rozszerzeń

Na stronie pojawi się ścieżka do zaktualizowanego spakowanego rozszerzenia.

Aktualizowanie plików rozszerzeń

Pakowanie za pomocą wiersza poleceń

Aby spakować rozszerzenia w wierszu poleceń, wywołaj chrome.exe. Użyj flagi --pack-extension , aby określić lokalizację folderu rozszerzenia, oraz flagi --pack-extension-key, aby określić lokalizację pliku klucza prywatnego rozszerzenia.

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

Host

Serwer, który hostuje pliki .crx, musi używać odpowiednich nagłówków HTTP, aby umożliwić użytkownikom zainstalowanie rozszerzenia przez kliknięcie linku.

Google Chrome uważa plik za możliwy do zainstalowania, jeśli spełniony jest co najmniej 1 z tych warunków:

  • Plik ma typ treści application/x-chrome-extension.
  • Sufiks pliku to .crx i spełnione są oba te warunki:
    • Plik nie jest wyświetlany z nagłówkiem HTTP X-Content-Type-Options: nosniff.
    • Plik jest wyświetlany z jednym z tych typów treści:
    • pusty ciąg
    • "text/plain"
    • "application/octet-stream"
    • "unknown/unknown"
    • "application/unknown"
    • "\*/\*"

Najczęstsza przyczyna nierozpoznania pliku jako możliwego do zainstalowania to wysyłanie przez serwer nagłówka X-Content-Type-Options: nosniff. Drugą najczęstszą przyczyną jest wysyłanie przez serwer nieznanego typu treści, czyli takiego, którego nie ma na poprzedniej liście. Aby rozwiązać problem z nagłówkiem HTTP, zmień konfigurację serwera lub spróbuj hostować plik .crx na innym serwerze.

Aktualizuj

Co kilka godzin przeglądarka sprawdza zainstalowane rozszerzenia pod kątem adresu URL aktualizacji. W przypadku każdego z nich wysyła żądanie do tego adresu URL, szukając pliku XML manifestu aktualizacji.

  • Treść zwracana przez sprawdzenie dostępności aktualizacji to dokument XML manifestu aktualizacji zawierający najnowszą wersję rozszerzenia.

Jeśli manifest aktualizacji zawiera wersję nowszą niż zainstalowana, przeglądarka pobiera i instaluje nową wersję. Podobnie jak w przypadku aktualizacji ręcznych, nowy plik .crx musi być podpisany tym samym kluczem prywatnym co obecnie zainstalowana wersja.

Uwaga: aby chronić prywatność użytkownika, Google Chrome nie wysyła żadnych nagłówków plików cookie z żądaniami pliku manifestu automatycznej aktualizacji i ignoruje wszystkie nagłówki Set-Cookie w odpowiedziach na te żądania.

URL aktualizacji

Rozszerzenia hostowane na serwerach poza Chrome Web Store muszą zawierać pole update_url w swoim manifest.json pliku.

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

Manifest aktualizacji

Manifest aktualizacji zwracany przez serwer powinien być dokumentem XML.

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

Ten format XML jest zapożyczony z formatu używanego przez Omaha, infrastrukturę aktualizacji Google. System rozszerzeń używa tych atrybutów w przypadku elementów <app> i <updatecheck> manifestu aktualizacji:

appid
Identyfikator rozszerzenia jest generowany na podstawie skrótu klucza publicznego, zgodnie z opisem w sekcji Pakowanie. Identyfikator rozszerzenia jest wyświetlany na stronie zarządzania rozszerzeniami.
codebase
Adres URL HTTPS do pliku .crx.
wersja
Używany przez klienta do określania, czy powinien pobrać plik .crx określony przez codebase. Powinien być zgodny z wartością „version” w pliku manifest.json pliku .crx.

Plik XML manifestu aktualizacji może zawierać informacje o wielu rozszerzeniach, ponieważ może zawierać wiele elementów <app>.

Testowanie

Domyślna częstotliwość sprawdzania dostępności aktualizacji wynosi kilka godzin, ale aktualizację można wymusić za pomocą przycisku Zaktualizuj rozszerzenia teraz na stronie zarządzania rozszerzeniami.

Aktualizuj rozszerzenia

Spowoduje to rozpoczęcie sprawdzania wszystkich zainstalowanych rozszerzeń.

Użycie zaawansowane: parametry żądania

Podstawowy mechanizm automatycznej aktualizacji został zaprojektowany tak, aby praca po stronie serwera była jak najprostsza. Wystarczy umieścić statyczny plik XML na dowolnym zwykłym serwerze WWW, np. Apache, i aktualizować ten plik XML w miarę wydawania nowych wersji rozszerzenia.

Deweloperzy hostujący wiele rozszerzeń mogą sprawdzać parametry żądania, które wskazują identyfikator i wersję rozszerzenia w żądaniu aktualizacji. Uwzględnienie tych parametrów umożliwia aktualizowanie rozszerzeń z tego samego adresu URL, na którym działa dynamiczny kod po stronie serwera, zamiast statycznego pliku XML.

Format parametrów żądania:

?x=EXTENSION_DATA

Gdzie EXTENSION_DATA to zakodowany w adresie URL ciąg znaków w formacie:

id=EXTENSION_ID&v=EXTENSION_VERSION

Na przykład 2 rozszerzenia wskazują ten sam adres URL aktualizacji (https://test.com/extension_updates.php):

  • Rozszerzenie 1
    • Identyfikator: „aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa”
    • Wersja: „1.1”
  • Rozszerzenie 2
    • Identyfikator: „bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb”
    • Wersja: „0.4”

Żądanie aktualizacji każdego rozszerzenia będzie wyglądać tak:

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

i

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

W jednym żądaniu można wymienić wiele rozszerzeń dla każdego unikalnego adresu URL aktualizacji. W poprzednim przykładzie, jeśli użytkownik ma zainstalowane oba rozszerzenia, 2 żądania zostaną połączone w jedno:

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

Jeśli liczba zainstalowanych rozszerzeń korzystających z tego samego adresu URL aktualizacji jest wystarczająco duża, aby adres URL żądania GET był zbyt długi (ponad 2000 znaków), sprawdzenie dostępności aktualizacji wysyła dodatkowe żądania GET w razie potrzeby.

Użycie zaawansowane: minimalna wersja przeglądarki

W miarę dodawania kolejnych interfejsów API do systemu rozszerzeń może zostać wydana zaktualizowana wersja rozszerzenia, która będzie działać tylko w nowszych wersjach przeglądarki. Chociaż Google Chrome jest aktualizowany automatycznie, może minąć kilka dni, zanim większość użytkowników zaktualizuje przeglądarkę do nowej wersji. Aby mieć pewność, że dana aktualizacja będzie stosowana tylko do wersji Google Chrome w wersji co najmniej określonej , dodaj atrybut "prodversionmin" do elementu <app> w odpowiedzi na aktualizację.

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

Dzięki temu użytkownicy będą mogli automatycznie zaktualizować przeglądarkę do wersji 2 tylko wtedy, gdy korzystają z Google Chrome w wersji 3.0.193.0 lub nowszej.