虽然与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在开发期间将保持不变。
如何在每次更改时避免打包扩展程序并重新安装? 如果我的开发扩展程序没有安装清单文件,我可以从中获取扩展程序的密钥,我可以从哪里获取它?
答案 0 :(得分:69)
获取扩展程序ID的最简单方法是生成.pem
文件,并使用this answer中所述的步骤提取扩展程序ID(阅读图片下方的部分)。
如果您只想使用命令行工具生成扩展ID ,请进一步查看。我将使用OpenSSL,因为它是跨平台的。
首先,我们生成一个私钥。保密这个私钥,不要丢失它。否则,您将无法创建具有相同扩展ID的CRX文件。撰写时,Chrome生成的私钥为PKC#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(从私钥派生)。
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
我已使用2>NUL
命令将openssl
放在每行的开头,以隐藏有关丢失配置文件的无害警告。
以下是在Linux上运行以前命令的示例。命令的相关输出以粗体显示。第一个命令创建一个文件,因此shell中没有可见的输出。请注意,第二个和第三个命令的输出不以换行符结束,因此有一个&#34; $&#34;在行尾(不应复制)。
$ # 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-----
答案 1 :(得分:6)
我发现这样做的最简单方法是在开发模式下使用 打包 Chrome扩展程序。
打包扩展程序:
转到此网址,打开Extensions管理页面: 铬://扩展
确保选中右上角的“开发者模式”复选框。 点击打包扩展程序按钮。出现一个对话框。
在Extension根目录字段中,指定扩展名文件夹的路径 - 例如~/mytodosextension
。 (忽略其他字段;第一次打包特定扩展名时不指定私钥文件。)
点击包。打包器创建两个文件:
.crx文件,这是可以安装的实际扩展名,
和.pem文件,其中包含私有密钥。
请参阅chrome文档here
答案 2 :(得分:2)
解压后的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__))