【问题标题】:Obtaining Chrome Extension ID for development获取用于开发的 Chrome 扩展程序 ID
【发布时间】:2014-07-15 10:24:45
【问题描述】:

虽然类似this SO question,但我不是问:

扩展的 ID 在什么情况下会发生变化?

也没有

如何将我的 zip 存档上传到 Chrome 仪表板?

然而,我在问,如何在不使用 Chrome 仪表板的情况下获取扩展程序的密钥。因此,我不认为它与this SO question 重复。

Chrome 扩展程序中的documentation for using Google Identity 表明需要将扩展​​程序的密钥复制到其清单文件中。

为了保持您的应用程序 ID 不变,您需要将密钥复制到 将 manifest.json 安装到您的源清单中。

但是,当导航到 recommended directory (...Google/Chrome/Default/Extensions) 时,我看不到解压后的扩展程序的 ID。我意识到这是因为扩展没有安装为.crx file。但是,documentation 显然是为了开发

将已安装 manifest.json 中的密钥复制到您的源清单中,这样 您的应用程序 ID 在开发过程中将保持不变

如何避免在每次进行更改时打包我的扩展程序并重新安装? 如果我的开发扩展没有安装的清单文件,我可以从中获取扩展的密钥,我可以从哪里得到它?

【问题讨论】:

  • 注意:自 Chrome 70+ 以来,这两个答案都已过时,因为它们不允许从本地磁盘加载打包的扩展。只能从 chrome 商店安装。尽管“扩展”选项卡中仍然有一个创建扩展的按钮 - 它会抛出与 CRX3 文件格式相关的错误。
  • 生成密钥的过程和上面不存在的文档真是太糟糕了:/
  • 您为什么不想使用 Chrome 仪表板?你可以在那里上传你的扩展而不发布它。然后就可以下载crx,从crx安装,从Data文件夹下生成的manifest.json文件中获取key。

标签: google-chrome-extension


【解决方案1】:

解压后的 Chrome 扩展程序 ID 是根据其目录的路径生成的。对于解压后的扩展,您可以通过以下方式生成 id(Python 中的代码):

import hashlib

m = hashlib.sha256()
m.update(bytes(PATH.encode('utf-8')))
EXTID = ''.join([chr(int(i, base=16) + ord('a')) for i in m.hexdigest()][:32])

其中 PATH 是扩展的规范化路径,即:

PATH = os.path.dirname(os.path.realpath(__file__))

【讨论】:

    【解决方案2】:

    简单的方法

    获取扩展 ID 的最简单方法是生成 .pem 文件并使用我的other answer 中描述的步骤提取扩展 ID(阅读图片下方的部分)。

    命令行方式

    此答案的其余部分适用于那些希望仅使用命令行工具生成扩展 ID 的人。我将使用OpenSSL,因为它是跨平台的。

    首先,我们生成一个私钥。将此私钥保密,不要丢失。否则,您将无法创建具有相同扩展 ID 的 CRX 文件。在撰写本文时,Chrome 生成的私钥是 PKCS #8 格式的 2048-bit RSA keys (1024-bit until 2013)。在整个答案中,我将这个私钥文件称为key.pem,因为the Chrome Web Store expects that the private key is called key.pem

    其次,我将展示如何为"key" field of the manifest file 生成值。这只是公钥,以 base64 格式编码。

    我的回答中的第三个命令显示了如何计算给定公钥(从私钥派生)的扩展 ID。

    Linux / Mac

    OpenSSL 安装在大多数 Linux 发行版上。如果没有,只需通过您最喜欢的包管理器安装openssl

    # Create private key called key.pem
    2>/dev/null openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -out key.pem
    
    # Generate string to be used as "key" in manifest.json (outputs to stdout)
    2>/dev/null openssl rsa -in key.pem -pubout -outform DER | openssl base64 -A
    
    # Calculate extension ID (outputs to stdout)
    2>/dev/null openssl rsa -in key.pem -pubout -outform DER |  shasum -a 256 | head -c32 | tr 0-9a-f a-p
    

    我已将2>/dev/null 放在每一行的开头,以防止“写入 RSA 密钥”输出到控制台。

    窗口

    如果您没有 OpenSSL,您可以从 this mirror 获取预编译的二进制文件。

    @echo off
    :: Assuming that you have installed OpenSSL in this directory
    SET PATH=%PATH%;C:\OpenSSL-Win32\bin
    
    :: Create private key called key.pem
    2>NUL openssl genrsa -out priv.tmp 2048
    2>NUL openssl pkcs8 -topk8 -in priv.tmp -nocrypt -out key.pem
    del priv.tmp
    
    :: Generate string to be used as "key" in manifest.json
    2>NUL openssl rsa -in key.pem -pubout -outform DER -out pub.tmp
    2>NUL openssl base64 -A -in pub.tmp
    del pub.tmp
    
    :: Calculate extension ID
    2>NUL openssl rsa -in key.pem -pubout -outform DER -out pub.tmp
    2>NUL openssl dgst -sha256 -out checksum.tmp pub.tmp
    SET /p EXTID=<checksum.tmp
    SET EXTID=%EXTID:* =%
    SET EXTID=%EXTID:~0,32%
    SET EXTID=%EXTID:f=p%
    SET EXTID=%EXTID:e=o%
    SET EXTID=%EXTID:d=n%
    SET EXTID=%EXTID:c=m%
    SET EXTID=%EXTID:b=l%
    SET EXTID=%EXTID:a=k%
    SET EXTID=%EXTID:9=j%
    SET EXTID=%EXTID:8=i%
    SET EXTID=%EXTID:7=h%
    SET EXTID=%EXTID:6=g%
    SET EXTID=%EXTID:5=f%
    SET EXTID=%EXTID:4=e%
    SET EXTID=%EXTID:3=d%
    SET EXTID=%EXTID:2=c%
    SET EXTID=%EXTID:1=b%
    SET EXTID=%EXTID:0=a%
    echo %EXTID%
    del checksum.tmp pub.tmp
    
    @echo on
    

    我使用openssl 命令将2&gt;NUL 放在每行的开头,以隐藏有关丢失配置文件的无害警告。

    示例

    以下是在 Linux 上运行上述命令的示例。命令的相关输出以粗体显示。第一个命令创建一个文件,因此 shell 中没有可见的输出。注意第二条和第三条命令的输出不以换行符结束,所以行尾有一个“$”(不要复制)。

    $ # 创建名为 key.pem 的私钥
    $ 2>/dev/null openssl genrsa 2048 | openssl pkcs8 -topk8 -nocrypt -out key.pem
    $ # 生成在 manifest.json 中用作“key”的字符串(输出到标准输出)
    $ 2>/dev/null openssl rsa -in key.pem -pubout -outform DER | openssl base64 -A
     MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8vj7SK0NZ6ak7K6m6KEAkfGaNfKUahqFFms6W8rq + voaW7nETrpsMqNyhmBQ + ea0KkyI / S5XIrDQPqDcNpvesYlg9lsmi7CQBZjJw7zNqKkvn0oYaP4SNtWZfZopBumqFbzFi5cst2PT + XU9CBitxXNtocRtcjOsa44W1gPA5xanmtlF258N6Nann + rSOAdhIWqSo / J6fj72cxTNfmqLkwAvhdS4Zyux4F87vxp4YTSwElfYXFsHZWi7h66uuuMzqyOyJz5grhCJ24rtTshMQUCxQWyhO2XT2J1tVfUN1YVw6xdKUz3aGyKZeXCuql5klHmlqE9PTlbKj / 1VMiIgCQIDAQAB  B> $
    $ # 计算扩展 ID(输出到标准输出)
    $ 2>/dev/null openssl rsa -in key.pem -pubout -outform DER | sha256sum |头-c32 | tr 0-9a-f a-p
    mfabfdnimhipcapcioneheloaehhoggk$
    $ cat key.pem # 显示 key.pem 的内容以保证演示的完整性
    -----开始私钥-----
    MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDy+PtIrQ1npqTs
    rqbooQCR8Zo18pRqGoUWazpbyur6+hpbucROumwyo3KGYFD55rQqTIj9LlcisNA+
    oNw2m96xiWD2WyaLsJAFmMnDvM2oqS+fShho/hI21Zl9mikG6aoVvMWLlyy3Y9P5
    dT0IGK3Fc22hxG1yM6xrjhbWA8DnFqea2UXbnw3o1qef6tI4B2EhapKj8np+PvZz
    FM1+aouTAC+F1LhnK7HgXzu/GnhhNLASV9hcWwdlaLuHrq664zOrI7InPmCuEInb
    iu1OyExBQLFBbKE7ZdPYnW1V9Q3VhXDrF0pTPdobIpl5cK6qXmSUeaWoT09OVsqP
    /VUyIiAJAgMBAAECggEAIztFPKmTOwdn/MXqf+rwqTjuUopFSQllaPXNdYf8AL6J
    Wema9IuFquYWcjO/Ki1wzH1ik8vHaMlYuOwcYnLBnN69x5s6AKFukNEx2IclDyLR
    O/jDh13oCDl600KqVk1Fk3dW8cHPAxyfnRmJ6wWhFPOC3yUbdabWhpYI66mJrDhN
    ZpN04RmH7DIlhlBpvq/OMVodhRtqb4/EVJYghTxUsrsv/I+3t3zl/o/c0DiOjiVZ
    pEBYzn0rrHP8BAEhJWagGNgvotHPaVKAjoYcUIOUTMM4P1Js034XKjP4MHE1pMbN
    VlVnQMz3/6CXFL+wU1QqfohdChmcnc4QwM+vCFK47QKBgQD/FjHxhCJco0rNqNua
    B0inGx2Jfb4b+FWwLyNobaYey11o0MjpkpAvYcfe3zW8DQtmepDxGL8CpORoWtFg
    sVnmhAir0I6bxdZLMwKcp4T+kHW3n/ae3z8tPvMvclCnARGEp+ccyDH9X2iyaSd5
    8DeJ6ND32+yr+vLgyyK/JW1z5wKBgQDz167cLe+xoRUqlKdJq8lzmij30lGVUT2D
    5Fn+2YUKIMeVEM7PlEmu9UmpN5HMA+LSNeiMZ1uhW5YQovXlXZCwoRqieeI4LMoM
    M335hsAWpS8pFRdlXMy885w5FUC5v4Ji0RUI37WON6fxNd8zFVqAMOcAANg716RI
    MWfblCJOjwKBgQDV8BKBIbYEBfv10poja9p2NFqodqpcIQIU2uQScGvzxdIY14q5
    wu9kndiYxpH1nuch0sf/PSbuG8do8kpKk1P37mKrXyZL5TgeJ7EYG7OCITxpfile
    Ci6dTv98mp6kAlRj8sH1tL2gaEWR5Hl0XpDl/DpOtsefUcAj4prIv6Y1nwKBgGUk
    obNSmonjdxQidQFp8DWzTCr/Yje9ava6UVoUf8qjriV2w1H3AFlCBTvbgO5O7laj
    ZcJXXPqhMq3T6ospNEBGsvWR+PO0IFrPQQGvkx3Rhq5TwVCaHZKCudozppVlin/S
    mhcENBq5mz/CSMK3qMJjhm3J6+dmmw4W8C10VIahAoGARf4zus0TQIxRlix1Oaaz
    sM5yANLcLivoeJDVOLUFUWgeSUc6Yma8T/FYlAkEVyyK+/nCWNErTS2yOzXEff01
    n8F0h1DJ4K5zxt0OhGUIUAGgR/kqpub0omqTJcJndLv2qgzofwK21Uih6yQzDeus
    lJsf3m3tuax5kcmhnDojbtE=
    -----结束私钥-----

    【讨论】:

    • 对于 OSX 上其他在执行Step 3 SSL 指令时获得sha256sum: command not found 的人,此评论为我解决了问题:*.com/a/8497894/556006
    • 对于那些在 OSX 上遇到 sha256sum: command not found 错误的人,您可以在 mac 上将其替换为 shasum -a 256。完整的命令行为:2&gt;/dev/null openssl rsa -in key.pem -pubout -outform DER | shasum -a 256 | head -c32 | tr 0-9a-f a-p
    • 您好,我已按照您的指示操作,最终得到了两个不同的 ID。需要明确的是,我在命令行上得到一个 ID (odl...),当我在 manifest.json 中设置 key 值并加载解压缩的扩展名 (mko...) 时,我得到另一个 ID。
    • @qodeninja 不,您无法获得给定扩展 ID 的 key.pem,除非您知道原始 key.pem 非常短。这将表明一个短的 RSA 密钥,然后通过蛮力计算所需的 key.pem 是可行的。用于签署 Chrome 扩展程序的 RSA 密钥很可能至少有 2k 位,因此实际上不可能从扩展程序 ID 反转为 key.pem。
    • 如果其他人遇到与@KarelFrajták 相同的问题,问题可能是您在清单中设置的“密钥”值必须是 base64 中的完整公钥,而不是截断的全部 -您在 chrome 扩展程序 UI 中看到的小写版本(称为“ID”)。
    【解决方案3】:

    我发现最简单的方法是在开发模式下打包 chrome 扩展。

    打包扩展:

    通过访问以下 URL 来打开扩展管理页面: chrome://extensions

    确保选中右上角的“开发者模式”复选框。 点击打包扩展按钮。出现一个对话框。

    在扩展根目录字段中,指定扩展文件夹的路径,例如~/mytodosextension。 (忽略其他字段;第一次打包特定扩展时不要指定私钥文件。)

    点击打包。打包器创建两个文件:

    • 一个.crx文件,这是可以安装的实际扩展,

    • 还有一个 .pem 文件,其中包含私有 密钥

    查看 chrome 文档here

    【讨论】:

    • 我们获得公钥/私钥后如何处理?
    • @AlexanderMills 您可以使用私钥在 manifest.json 中设置 key 字段。它将确保始终生成相同的 chrome 扩展 ID。
    • 这会为所有从网上商店安装的人生成通用扩展 ID 吗?
    • 好方法。安装生成的crx文件,进入对应的扩展目录。打开 manifest.json 文件并复制密钥条目。将其粘贴到打包应用的清单中。然后再次卸载 crx 扩展,因为您不再需要它了。现在,您的未打包应用程序将在所有安装中使用 crx 文件中生成的 ID。记得在上传到 Chrome 应用商店之前从清单中删除密钥。
    • @insanely_sin 是的,密钥被称为“密钥”。复制该行,包括长键值并将其插入到原始应用的清单中