Chrome插件離線安裝方法及編程思路

開始

  在看這篇文章之前,你可以有兩個選擇:  

  1. 網上下載Chrome插件伴侶這一工具,一鍵離線安裝插件(注意:博主非工具作者,不保證此工具安全性,請自行分析),然後關閉此文章。  
  2. 繼續看下去搞懂原理,然後自己手動離線安裝插件或編寫一個屬於自己的離線安裝工具。

手動化安裝方法

  首先進入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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章