開始
在看這篇文章之前,你可以有兩個選擇:
- 網上下載
Chrome插件伴侶
這一工具,一鍵離線安裝插件(注意:博主非工具作者,不保證此工具安全性,請自行分析),然後關閉此文章。 - 繼續看下去搞懂原理,然後自己手動離線安裝插件或編寫一個屬於自己的離線安裝工具。
手動化安裝方法
首先進入Chrome
擴展程序的管理頁面,在地址欄敲入chrome://extensions/
即可進入。
然後把右上角的開發者模式
打開(剛不是說無需這個模式嗎?別急,暫時的。),拖入插件進行添加,複製插件的ID
後關閉開發者模式
即可。如圖所示:
接着關閉Chrome
,將以下內容複製粘貼到記事本上保存,將文本後綴名.txt
改爲.reg
,雙擊運行。
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome\ExtensionInstallWhitelist]
"1"="ijaojehcgjneognjmhdiidbfhpgfkkgp"
若要添加多個插件,"1"="ijaojehcgjneognjmhdiidbfhpgfkkgp"
以此類推往下添加"2"="插件ID"
、"3"="插件ID"
……
最後重新打開Chrome
後插件就可以正常使用了,如安裝的插件沒有立即啓用,可直接到擴展程序管理頁面裏手動開啓。
自動化編程思路
獲取插件公鑰和版本號
這裏需要從.crx
包頭提取公鑰和版本號(製作插件時命名的版本號)以作備用。
CRX 包的頭信息
頭信息包含作者的公共密鑰和擴展程序的簽名,簽名以SHA-1
算法使用作者的私有密鑰從.zip
文件生成。頭信息要求字節順序爲小端序並以4字節對齊。下表按順序描述.crx
的頭信息:
字段 | 類型 | 長度 | 值 | 描述 |
---|---|---|---|---|
magic number | char[] | 32 位 | Cr24 | Chrome 要求每一個 .crx 包的開頭包含此常量。 |
version | unsigned int | 32 位 | 2 | *.crx 文件格式的版本(當前爲2)。 |
public key length | unsigned int | 32 位 | pubkey.length | RSA 公共密鑰的長度,以字節爲單位。 |
signature length | unsigned int | 32 位 | sig.length | 簽名的長度,以字節爲單位。 |
public key | byte[] | pubkey.length | pubkey.contents | 作者的 RSA 公共密鑰內容,以 X509 SubjectPublicKeyInfo 塊的格式表示。 |
signature | byte[] | sig.length | sig.contents | ZIP 內容使用作者私有密鑰的簽名,該簽名使用 RSA 算法以及 SHA-1 散列函數創建。 |
例子:
43 72 32 34 # "Cr24" -- the magic number
02 00 00 00 # 2 -- the crx format version number
A2 00 00 00 # 162 -- length of public key in bytes
80 00 00 00 # 128 -- length of signature in bytes
........... # the contents of the public key
........... # the contents of the signature
........... # the contents of the zip file
獲取插件ID
插件的ID
可以從插件的公鑰得到,經過如下計算:
graph LR
公鑰 --> Base64
Base64 --> SHA256
SHA256 --> Base16
Base16 --> 插件ID
示例代碼:
def build_id(pub_key_pem):
pub_key_der = base64.b64decode(pub_key_pem)
sha = hashlib.sha256(pub_key_der).hexdigest()
prefix = sha[:32]
extension_id = ""
ord_a = ord('a')
for old_char in prefix:
code = int(old_char, 16)
new_char = chr(ord_a + code)
extension_id += new_char
return extension_id
重命名和移動插件
將插件重命名爲插件ID.crx
,移動到AppData\Local\ChromeExtensionCache
(沒有就新建)處作爲插件存放路徑。
部署安裝
在註冊表添加插件信息,chrome
啓動時會自動安裝。
在註冊表HKEY_CURRENT_USER\Software\Google\Chrome\Extensions
添加以插件ID命名的項,以及插件存放路徑path
、插件版本號version
兩個字符串值,而version
值就是從.crx
包頭獲取的版本號。如圖:
添加白名單
在註冊表HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\ExtensionInstallWhitelist
添加以數字命名的字符串值,其數值數據爲插件ID。(與上述的手動化安裝方法中導入.reg
一樣,只是編程時直接操作註冊表即可)
後記
如果安裝插件部署安裝成功後又卸載掉了插件,第二次安裝時就不會自動安裝,這是因爲AppData\Local\Google\Chrome\User Data\Default
目錄下的Secure Preferences
記錄了該插件的卸載信息,要想解決這個問題,一是直接刪除Secure Preferences
文件(這會導致Chrome
的個人設置偏好丟失,即恢復出廠設置),二是修改Secure Preferences
,將該插件的卸載信息剔除掉(太麻煩)。
博主個人覺得比較舒服的做法是重新打包插件,即每次安裝該插件前,都經過解包-->打包
這一步驟。因爲插件在不指定密鑰進行打包時會自動生成隨機密鑰,而公鑰又是從密鑰中獲得,所以插件ID也會是隨機的,隨着插件ID的更新,Secure Preferences
中該插件對應的插件ID卸載信息就會失效,從而達到每次安裝都是第一次
的效果。
和手動打包不同,通過編程的方式打包當然不可能傻傻地去操作Chrome
界面,這裏用到一個Chrome
的打包命令,可指定一個密鑰打包,也可不指定,這會隨機生成一個後綴爲.pem
的密鑰(當然,也可以自己生成一個)。命令如下:
chrome.exe --pack-extension=C:\myext --pack-extension-key=C:\myext.pem