Google chrome extension 获取用于开发的Chrome扩展ID

Google chrome extension 获取用于开发的Chrome扩展ID,google-chrome-extension,Google Chrome Extension,虽然类似于,但我不是在问: 在什么情况下扩展的ID会更改 也不是 如何将zip存档上传到Chrome仪表板 然而,我在问,如何在不使用Chrome仪表板的情况下获得分机的密钥。因此,我不认为它是重复的。 Chrome扩展的内部声明需要将扩展的密钥复制到其清单文件中 要保持应用程序ID不变,需要在 已将manifest.json安装到源清单中 但是,当导航到(…Google/Chrome/Default/Extensions)时,我看不到我的解包扩展的ID。我意识到这是因为扩展未按要求安装。但是,

虽然类似于,但我不是在问:

在什么情况下扩展的ID会更改

也不是

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

然而,我在问,如何在不使用Chrome仪表板的情况下获得分机的密钥。因此,我不认为它是重复的。

Chrome扩展的内部声明需要将扩展的密钥复制到其清单文件中

要保持应用程序ID不变,需要在 已将manifest.json安装到源清单中

但是,当导航到(…
Google/Chrome/Default/Extensions
)时,我看不到我的解包扩展的ID。我意识到这是因为扩展未按要求安装。但是,为了开发的目的,清楚地写下了:

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

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

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

命令行方式 此答案的其余部分适用于那些只想使用命令行工具生成扩展ID的用户。我将使用,因为它是跨平台的

首先,我们生成一个私钥。请保守此私钥的秘密,不要丢失它。否则,您将无法创建具有相同扩展名ID的CRX文件。编写时,Chrome生成的私钥为PKCS#8格式()。在整个回答过程中,我将把这个私钥文件称为
key.pem
,因为

第二,我展示了如何为数据生成值。这只是以base64格式编码的公钥

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

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

#创建名为key.pem的私钥
2> /dev/null openssl genrsa 2048 | openssl pkcs8-topk8-nocrypt-out key.pem
#生成用作manifest.json中“键”的字符串(输出到stdout)
2> /dev/null openssl rsa-in key.pem-pubout-outform DER | openssl base64-A
#计算扩展ID(输出到标准输出)
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,可以从中获取预编译的二进制文件


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

打包扩展名:

转到以下URL,打开扩展管理页面: chrome://extensions

确保选中右上角的“开发人员模式”复选框。 单击包扩展按钮。此时会出现一个对话框

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

单击包
。打包程序创建两个文件:

  • .crx文件,它是可以安装的实际扩展名

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


请参阅chrome文档

未打包的chrome扩展ID是根据其目录的路径生成的。对于未打包的扩展,可以以下列方式生成id(Python代码):

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

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

对于OSX上的任何其他人,如果在执行SSL指令的第3步时发现
sha256sum:command not found
,此评论为我解决了这个问题:对于OSX上出现
sha256sum:command not found
错误的人,您可以在mac上用
shasum-a 256
替换它。完整的命令行是:
2>/dev/null openssl rsa-in key.pem-pubout-outform DER | shasum-a 256 | head-c32 | tr 0-9a-f a-p
Hi,我按照您的指示,最终得到了两个不同的ID。为了清楚起见,我在命令行上得到一个ID(
odl…
),在
manifest.json
中设置
key
值并加载未打包的扩展名(
mko…
)时得到另一个ID。@qodeninja不,除非您知道原来的key.pem非常短,否则无法获得给定扩展名的key.pem。这将指示一个短的RSA密钥,然后通过蛮力计算所需的key.pem是可行的。很可能用于签名Chrome扩展的RSA密钥至少有2k位,因此在实践中不可能从扩展ID反转为key.pem。如果其他人遇到与@KarelFrajták相同的问题,问题可能是您在清单中设置的“key”值必须是base64中的完整公钥,不是您在chrome扩展UI中看到的截短的全小写版本(称为“ID”)。获得公钥/私钥后,我们如何处理它们?@AlexanderMills您可以在manifest.json中使用私钥设置
key
字段。这将确保始终生成相同的chrome扩展id。这会为所有将从web store安装的用户生成通用扩展id吗?这是一个简单的好方法。安装生成的crx文件并转到相应的扩展目录。O $ # 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 MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA8vj7SK0NZ6ak7K6m6KEAkfGaNfKUahqFFms6W8rq+voaW7nETrpsMqNyhmBQ+ea0KkyI/S5XIrDQPqDcNpvesYlg9lsmi7CQBZjJw7zNqKkvn0oYaP4SNtWZfZopBumqFbzFi5cst2PT+XU9CBitxXNtocRtcjOsa44W1gPA5xanmtlF258N6Nann+rSOAdhIWqSo/J6fj72cxTNfmqLkwAvhdS4Zyux4F87vxp4YTSwElfYXFsHZWi7h66uuuMzqyOyJz5grhCJ24rtTshMQUCxQWyhO2XT2J1tVfUN1YVw6xdKUz3aGyKZeXCuql5klHmlqE9PTlbKj/1VMiIgCQIDAQAB$ $ # Calculate extension ID (outputs to stdout) $ 2>/dev/null openssl rsa -in key.pem -pubout -outform DER | sha256sum | head -c32 | tr 0-9a-f a-p mfabfdnimhipcapcioneheloaehhoggk$ $ cat key.pem # Show content of key.pem for completeness of this demo -----BEGIN PRIVATE KEY----- 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= -----END PRIVATE KEY-----
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 = os.path.dirname(os.path.realpath(__file__))