Id like to be able to generate a crx file with PHP.
A crx file is a zip file with an additional header and Im at a lost on how to create this header. I can create a crx file if I use a pregenerated pem file but this leads to all the crx files having the same extension id and this is not good. Heres a link to what Ive got so far.....
http://valorsolo.com/index.php?page=Viewing%20Message&id=1472&pagenum=2#1500
Incase it helps this has been done in Python and there is an excellent blog post on the finer details here....
http://blog.roomanna.com/12-12-2010/packaging-chrome-extensions
and heres some links to other code on the subject.....
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/
This ruby code was helpful.
Your public key must be in DER format, and unfortunately PHP's OpenSSL extension can't do that, so far as I can tell. I had to generate it from my private key at the command line:
openssl rsa -pubout -outform DER < extension_private_key.pem > extension_public_key.pub
UPDATE: there is a PHP der2pem() function available here, thanks to tutuDajuju for pointing it out.
Once that's done, building the .crx file is quite easy:
# 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);
The CRX format is described in detail on the documentation page: http://code.google.com/chrome/extensions/crx.html
There are examples on the end of that file for Ruby and Bash. Follow the format in your language (PHP).
You can use the working PHP solution: https://github.com/andyps/crxbuild There are a PHP class that you can include in your project and command line script.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With