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.

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.

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.

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

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.

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

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
.crxi 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""\*/\*"
- Plik nie jest wyświetlany z nagłówkiem HTTP
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.
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
.crxokreślony przezcodebase. Powinien być zgodny z wartością „version” w plikumanifest.jsonpliku.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.

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.