【问题标题】:Create Google Chrome Crx file with PHP使用 PHP 创建 Google Chrome Crx 文件
【发布时间】:2026-01-31 00:25:02
【问题描述】:

我希望能够用 PHP 生成 crx 文件。

crx 文件是带有附加标头的 zip 文件,我不知道如何创建此标头。如果我使用预生成的 pem 文件,我可以创建一个 crx 文件,但这会导致所有 crx 文件具有相同的扩展名 id,这并不好。这是我到目前为止所获得的链接.....
http://valorsolo.com/index.php?page=Viewing%20Message&id=1472&pagenum=2#1500

如果它有助于这已在 Python 中完成,这里有一篇关于更详细信息的优秀博客文章....
http://blog.roomanna.com/12-12-2010/packaging-chrome-extensions
还有一些关于该主题的其他代码的链接.....
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/

【问题讨论】:

    标签: php google-chrome google-chrome-extension crx


    【解决方案1】:

    这个ruby code 很有帮助。

    您的公钥必须是 DER 格式,不幸的是,据我所知,PHP 的 OpenSSL 扩展无法做到这一点。我必须在命令行从我的私钥生成它:

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

    更新:有一个PHP der2pem()函数available here,感谢tutuDajuju指出。

    完成后,构建 .crx 文件就非常简单了:

    # 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);
    

    【讨论】:

    • 感谢您的意见,但这几乎是我所能做的。这将很好地签署一个 zip,但正如我上面所说的,所有扩展都将具有相同的扩展 ID,这远非理想。谢谢你。
    • 你确定这是件坏事吗?请注意,在清单文件中,使用该 ID 检查更新。如果每次构建都更改了 ID,Chrome 将永远不会看到您的扩展程序的任何更新。见code.google.com/chrome/extensions/autoupdate.html
    • 由于 PHP 的 Open SSL 函数使用 .pem 格式,您可以使用函数将 .pem 转换为 .der 格式,反之亦然。见:php.net/manual/en/ref.openssl.php#74188。如果您愿意,您还可以在每次创建时创建一个新密钥,然后获得唯一的 ID。然后,保存密钥,获取公钥的哈希值(这应该是 ID)并存储两者以创建一个动态的创建和更新系统。
    • 啊。感谢您指出 pem2der() 函数!非常有用。
    • @JonathonHill 此代码对我不起作用。我使用了 Chrome 创建的 pem,然后通过您的命令行代码生成了“.pub”,然后使用了您的其余代码,但出现错误:Package is invalid: CRX_SIGNATURE_VERIFICATION_INITIALIZATION_FAILED。知道有什么问题吗?
    【解决方案2】:

    文档页面详细描述了 CRX 格式: http://code.google.com/chrome/extensions/crx.html

    该文件末尾有 Ruby 和 Bash 的示例。遵循您的语言 (PHP) 中的格式。

    【讨论】:

    • 如果我能做到这一点,我就不会寻求帮助;)但是感谢您提供该链接,我忘记了那个....并且我已经阅读了它(很多次)它只是有点超出我的范围。
    【解决方案3】:

    您可以使用有效的 PHP 解决方案:https://github.com/andyps/crxbuild 您可以在项目和命令行脚本中包含一个 PHP 类。

    【讨论】: