我想从 PHP 生成一个 Chrome 扩展(Chrome 主题)。我的 PHP 脚本会生成一个 zip 文件 (download.zip)。要将其转换为 .crx 包,它需要添加标头,包括公钥和签名。
我看到了这个答案,但是您需要一个生成 .pub 文件的 .pem 文件。我在共享主机上,所以 exec() 不起作用(将 .pem 转换为 .pub)。无需 .pem 文件,只需下载一次即可使用(无需更新)。
然后我看到了这条评论,解释了你可以生成私钥和公钥。将这两个脚本结合起来是行不通的(参见代码)。
如何生成密钥对并使用它来使用 PHP 对 chrome .crx 包进行签名?
此代码失败(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);