Cómo instalar extensiones en Linux

Las extensiones alojadas fuera de Chrome Web Store solo pueden ser instaladas por usuarios de Linux. En este artículo, se describe cómo empaquetar, alojar y actualizar archivos .crx desde un servidor personal. Si distribuyes una extensión o un tema solo a través de Chrome Web Store, consulta Alojamiento y actualización de Web Store.

Presentación

Las extensiones y los temas se entregan como archivos .crx. Cuando subes contenido a través del Panel para desarrolladores de Chrome , el panel crea el archivo .crx automáticamente. Si se publica en un servidor personal, el archivo .crx deberá crearse de forma local o descargarse de Chrome Web Store.

Descarga el archivo .crx desde Chrome Web Store

Si una extensión está alojada en Chrome Web Store, el archivo .crx se puede descargar desde el Panel del desarrollador. Busca la extensión en "Tus fichas" y haz clic en "Más información". En la ventana emergente, haz clic en el vínculo azul main.crx para descargarlo.

Descarga el archivo .crx desde el Panel del desarrollador

El archivo descargado se puede alojar en un servidor personal. Esta es la forma más segura de alojar una extensión de forma local, ya que el contenido de la extensión estará firmado por Chrome Web Store. Esto ayuda a detectar posibles ataques y manipulaciones.

Cómo crear un archivo .crx de forma local

Los directorios de extensiones se convierten en archivos .crx en la página de administración de extensiones. Navega a chrome://extensions/ en la barra de direcciones o haz clic en el menú de Chrome, coloca el cursor sobre "Más herramientas" y, luego, selecciona "Extensiones".

En la página de administración de extensiones, haz clic en el botón de activación junto a Modo de desarrollador para habilitarlo. Luego, selecciona el botón PACK EXTENSION.

Si el modo de desarrollador está marcado, haz clic en Empaquetar extensión.

Especifica la ruta de acceso a la carpeta de la extensión en el campo Directorio raíz de la extensión y, luego, haz clic en el botón EMPAQUETAR EXTENSIÓN. Ignora el campo Clave privada para un paquete nuevo.

Especifica la ruta de la extensión y, luego, haz clic en Pack Extension.

Chrome creará dos archivos, un archivo .crx y un archivo .pem, que contiene la clave privada de la extensión.

Archivos de extensión empaquetados

No pierdas la clave privada. Mantén el archivo .pem en un lugar secreto y seguro, ya que se necesitará para actualizar la extensión.

Cómo actualizar un paquete .crx

Actualiza el archivo .crx de una extensión aumentando el número de versión en manifest.json.

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

Regresa a la página de administración de extensiones y haz clic en el botón EMPAQUETAR EXTENSIÓN. Especifica la ruta de acceso al directorio de extensiones y la ubicación de la clave privada.

Cómo actualizar los archivos de expansión

En la página, se proporcionará la ruta de acceso a la extensión empaquetada actualizada.

Cómo actualizar los archivos de expansión

Empaquetado a través de la línea de comandos

Invoca chrome.exe para empaquetar extensiones en la línea de comandos. Usa la marca --pack-extension para especificar la ubicación de la carpeta de la extensión y la marca --pack-extension-key para especificar la ubicación del archivo de claves privadas de la extensión.

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

Hosting

Un servidor que aloja archivos .crx debe usar encabezados HTTP adecuados para permitir que los usuarios instalen la extensión haciendo clic en un vínculo.

Google Chrome considera que un archivo se puede instalar si se cumple alguna de las siguientes condiciones:

  • El archivo tiene el tipo de contenido application/x-chrome-extension.
  • El sufijo del archivo es .crx y ambas de las siguientes afirmaciones son verdaderas:
    • El archivo no se publica con el encabezado HTTP X-Content-Type-Options: nosniff
    • El archivo se publica con uno de los siguientes tipos de contenido:
    • string vacía
    • "text/plain"
    • "application/octet-stream"
    • "unknown/unknown"
    • "application/unknown"
    • "*/*"

El motivo más común por el que no se reconoce un archivo instalable es que el servidor envía el encabezado X-Content-Type-Options: nosniff. El segundo motivo más común es que el servidor envía un tipo de contenido desconocido, es decir, uno que no está en la lista anterior. Para solucionar un problema con el encabezado HTTP, cambia la configuración del servidor o intenta alojar el archivo .crx en otro servidor.

Actualizando

Cada ciertas horas, el navegador verifica si las extensiones instaladas tienen una URL de actualización. Para cada una, realiza una solicitud a esa URL en busca de un archivo en formato XML de manifiesto de actualización.

  • El contenido que devuelve una verificación de actualización es un documento XML del manifiesto de actualización que enumera la versión más reciente de una extensión.

Si el manifiesto de actualización menciona una versión más reciente que la instalada, el navegador descarga e instala la nueva versión. Al igual que con las actualizaciones manuales, el nuevo archivo .crx debe firmarse con la misma clave privada que la versión instalada actualmente.

Nota: Para mantener la privacidad del usuario, Google Chrome no envía ningún encabezado Cookie con las solicitudes de manifiesto de actualización automática y omite cualquier encabezado Set-Cookie en las respuestas a esas solicitudes.

Actualizar URL

Las extensiones alojadas en servidores fuera de Chrome Web Store deben incluir el campo update_url en su archivo manifest.json.

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

Actualiza el manifiesto

El manifiesto de actualización que devuelve el servidor debe ser un documento 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>

Este formato XML se toma prestado del que usa Omaha, la infraestructura de actualización de Google. El sistema de extensiones usa los siguientes atributos para los elementos <app> y <updatecheck> del manifiesto de actualización:

appidEl ID de la extensión se genera en función de un hash de la clave pública, como se describe en empaquetado. El ID de una extensión se muestra en la página de administración de extensiones.
base de códigoEs una URL HTTPS al archivo .crx.
versiónEl cliente lo usa para determinar si debe descargar el archivo .crx especificado por codebase. Debe coincidir con el valor de "version" en el archivo manifest.json del archivo .crx.

El archivo XML del manifiesto de actualización puede contener información sobre varias extensiones si incluye varios elementos <app>.

Prueba

La frecuencia predeterminada de la verificación de actualizaciones es de varias horas, pero se puede forzar una actualización con el botón Actualizar extensiones ahora en la página de administración de extensiones.

Actualizar las extensiones ahora

Se iniciarán las verificaciones de todas las extensiones instaladas.

Uso avanzado: parámetros de solicitud

El mecanismo básico de actualización automática está diseñado para que el trabajo del lado del servidor sea tan sencillo como colocar un archivo en formato XML estático en cualquier servidor web simple, como Apache, y actualizar ese archivo en formato XML a medida que se lancen nuevas versiones de la extensión.

Los desarrolladores que alojan varias extensiones pueden verificar los parámetros de la solicitud, que indican el ID y la versión de la extensión en la solicitud de actualización. Incluir estos parámetros permite que las extensiones se actualicen desde la misma URL que ejecuta código dinámico del servidor en lugar de un archivo en formato XML estático.

El formato de los parámetros de la solicitud es el siguiente:

?x=EXTENSION_DATA

Aquí, EXTENSION_DATA es una cadena codificada como URL con el siguiente formato:

id=EXTENSION\_ID&v=EXTENSION\_VERSION

Por ejemplo, dos extensiones apuntan a la misma URL de actualización (https://test.com/extension_updates.php):

  • Extensión 1
    • ID: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
    • Versión: "1.1"
  • Extensión 2
    • ID: "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
    • Versión: "0.4"

La solicitud para actualizar cada extensión individual sería la siguiente:

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

y

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

Se pueden incluir varias extensiones en una sola solicitud para cada URL de actualización única. En el ejemplo anterior, si un usuario tiene instaladas ambas extensiones, las dos solicitudes se combinan en una sola:

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

Si la cantidad de extensiones instaladas que usan la misma URL de actualización es lo suficientemente grande como para que la URL de una solicitud GET sea demasiado larga (más de 2,000 caracteres aproximadamente), la verificación de actualización emite solicitudes GET adicionales según sea necesario.

Uso avanzado: versión mínima del navegador

A medida que se agreguen más APIs al sistema de extensiones, es posible que se lance una versión actualizada de una extensión que solo funcione con versiones más recientes del navegador. Si bien Google Chrome se actualiza automáticamente, es posible que pasen algunos días antes de que la mayoría de la base de usuarios se actualice a cualquier nuevo lanzamiento. Para garantizar que una actualización determinada se aplique solo a las versiones de Google Chrome iguales o superiores a una versión específica, agrega el atributo "prodversionmin" al elemento en la respuesta de actualización.

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

Esto garantizaría que los usuarios se actualizarían automáticamente a la versión 2 solo si ejecutan Google Chrome 3.0.193.0 o una versión posterior.