Создание Chrome.CRX из РНР
Я хочу создать расширение Chrome (тема Chrome) из PHP. Мой PHP скрипт генерирует zip-файл (скачать.промелькнуть.) Чтобы преобразовать его в .пакет crx, он должен добавить заголовки, включая открытый ключ и подпись.
Я видел этой ответ, но вам нужен .PEM-файл, который создает .файл паба. Я нахожусь на общем хостинге, поэтому exec () не будет работать (для преобразования.PEM в .паб.) В этом нет необходимости .PEM-файл, он должен использовать его только после загрузки (без обновления необходимый.)
затем я увидел этой комментарий, который объясняет, что вы можете создавать закрытые и открытые ключи. Объединение двух сценариев не будет работать (см. код).
как я могу создать пару клавиш и использовать ее для подписи chrome .пакет crx с PHP?
этот код завершается с ошибкой (CRX_SIGNATURE_VERIFICATION_INITALIZATION_FAILED):
// Create the keypair
$res=openssl_pkey_new();
// Get private key
openssl_pkey_export($res, $pk);
// Get public key
$key=openssl_pkey_get_details($res);
$key=$key["key"];
# make a SHA1 signature using our private key
openssl_sign(file_get_contents('download.zip'), $signature, $pk, 'sha1');
# decode the public key
$key = base64_decode($key);
# .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('download.zip')); // package contents, zipped
fclose($fh);
1 ответов
вы используете openssl_pkey_export
неправильно, и вы не удалены
-----BEGIN PUBLIC KEY-----
...
-----END PUBLIC KEY-----
из строки открытого ключа перед его декодированием. Я понял это, посмотрев на длину открытого ключа и подписи. Первый должен быть 161, а второй-длиной 128 байт (источник):
A2 00 00 00 # 162 -- length of public key in bytes
80 00 00 00 # 128 -- length of signature in bytes
вот фиксированный код (PHP 5.4):
$pk=file_get_contents('pk.pem');
$priv = openssl_pkey_get_private($pk);
$pub = openssl_pkey_get_details($priv)['key'];
# make a SHA1 signature using our private key
openssl_sign(file_get_contents('download.zip'), $signature, $priv, OPENSSL_ALGO_SHA1);
# geting rid of -----BEGIN/END PUBLIC KEY-----
# you can probably do it better using preg_match_all / explode(PHP_EOL, $pub) etc.
$pub = trim(explode('-----',$pub)[2]);
# decode the public key
$pub = base64_decode($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($pub))); // public key length
fwrite($fh, pack('V', strlen($signature))); // signature length
fwrite($fh, $pub); // public key
fwrite($fh, $signature); // signature
fwrite($fh, file_get_contents('download.zip')); // package contents, zipped
fclose($fh);