2011-02-16 28 views
5

Me gustaría generar un archivo crx con PHP.Crear archivo Google Chrome Crx con PHP

Un archivo crx es un archivo zip con un encabezado adicional y estoy perdido en cómo crear este encabezado. Puedo crear un archivo crx si utilizo un archivo pem pregenerado pero esto lleva a que todos los archivos crx tengan el mismo ID de extensión y esto no es bueno. Aquí está un enlace a lo Ive consiguió hasta ahora .....
http://valorsolo.com/index.php?page=Viewing%20Message&id=1472&pagenum=2#1500

En caso que ayuda a esto se ha hecho en Python y hay una excelente entrada de blog en los detalles más finos aquí ....
http://blog.roomanna.com/12-12-2010/packaging-chrome-extensions
y aquí algunos enlaces a otros códigos sobre el tema .....
http://code.google.com/chrome/extensions/crx.html
http://code.google.com/p/crx-packaging/source/browse/trunk/packer.py
https://github.com/bellbind/crxmake-python/blob/master/crxmake.py
http://www.curetheitch.com/projects/buildcrx/

Respuesta

2

formato El CRX se describe en detalle en la página de documentación: http://code.google.com/chrome/extensions/crx.html

Hay ejemplos en el final de ese archivo para Ruby y Bash. Sigue el formato en tu idioma (PHP).

+0

Si pudiera hacer eso no estaría pidiendo ayuda;) Pero gracias por poner ese enlace, lo olvidé ... y lo he leído (muchas veces) es solo un poco más allá de mí . – PAEz

3

Esto ruby code fue útil.

Su clave pública debe estar en formato DER, y lamentablemente la extensión de OpenSSL de PHP no puede hacer eso, por lo que yo sé. Tenía que generarlo a partir de mi clave privada en la línea de comandos:

openssl rsa -pubout -outform DER <extension_private_key.pem> extension_public_key.pub 

ACTUALIZACIÓN: hay una der2pem() de PHP available here, gracias a tutuDajuju por señalarlo.

Una vez hecho esto, la construcción del archivo .crx es muy fácil:

# make a SHA1 signature using our private key 
$pk = openssl_pkey_get_private(file_get_contents('extension_private_key.pem')); 
openssl_sign(file_get_contents('extension.zip'), $signature, $pk, 'sha1'); 
openssl_free_key($pk); 

# decode the public key 
$key = base64_decode(file_get_contents('extension_public_key.pub')); 

# .crx package format: 
# 
# magic number    char(4) 
# crx format ver    byte(4) 
# pub key lenth    byte(4) 
# signature length   byte(4) 
# public key     string 
# signature     string 
# package contents, zipped string 
# 
# see http://code.google.com/chrome/extensions/crx.html 
# 
$fh = fopen('extension.crx', 'wb'); 
fwrite($fh, 'Cr24');        // extension file magic number 
fwrite($fh, pack('V', 2));      // crx format version 
fwrite($fh, pack('V', strlen($key)));   // public key length 
fwrite($fh, pack('V', strlen($signature)));  // signature length 
fwrite($fh, $key);        // public key 
fwrite($fh, $signature);       // signature 
fwrite($fh, file_get_contents('extension.zip')); // package contents, zipped 
fclose($fh); 
+0

Gracias por su aporte, pero eso es más o menos lo que puedo hacer. Esto firmará un zip muy bien, pero como indiqué anteriormente, todas las extensiones tendrán la misma ID de extensión que está lejos de ser ideal. Gracias tho. – PAEz

+2

¿Estás seguro de que es algo malo? Aviso en el archivo de manifiesto, las actualizaciones se verifican usando esa misma ID. Si la ID cambia con cada compilación, Chrome nunca verá ninguna actualización de tu extensión. Consulte http://code.google.com/chrome/extensions/autoupdate.html –

+0

ya que las funciones Open SSL de PHP usan el formato .pem, puede usar una función para convertir de .pem a formato .der o viceversa. Ver: http://www.php.net/manual/en/ref.openssl.php#74188. También puede crear una nueva clave en cada creación si lo desea y luego obtener identificaciones únicas. Luego, guarde las claves, obtenga el hash de la clave pública (esta debería ser la ID) y almacene ambas para crear un sistema dinámico de creación y actualización. – tutuDajuju