2010-07-07 55 views
12

我想以編程方式創建chrome擴展crx文件(不使用chrome.exe,因爲它會打開新的chrome窗口)。那麼對於相同的選擇有哪些?我的首選是java,但如果它可能在其他語言,那麼我也沒關係。如何以編程方式創建chrome crx文件(最好在java中)?

+0

我也有類似的問題,這裏是解決方案: http://stackoverflow.com/questions/24661167/generating-chrome-packaged-app-crx-header-with-java/24675290 #24675290 – JavaHead 2014-07-11 03:30:02

回答

12

有多種用途要做到這一點,在各種語言(儘管,他們大多是殼/腳本語言)

我不能發佈的鏈接,所有的人,因爲我是一個新的計算器用戶 - 我只能發佈1個鏈接,所以我創建了一個列出它們的頁面 - 包括我在下面提到的一個C頁面 - http://curetheitch.com/projects/buildcrx/6/

無論如何,我花了幾個小時在C上運行一個版本,該版本在Windows或Linux,因爲其他解決方案需要安裝腳本語言或shell(即python,ruby,bash等)和OpenSSL。我寫的實用程序有靜態鏈接的OpenSSL,所以沒有解釋器或庫的需求。

存儲庫託管在github上,但上面的鏈接列出了我的實用程序和其他人員解決方案。

沒有列出Java,這是您的偏好,但希望這有助於!

+0

正是我在找什麼。謝謝。 – 2011-08-14 21:54:57

+0

我知道這是舊的,但是這對我幫助很大! – hawkfalcon 2012-05-13 00:42:14

+3

你可以更新你的答案與實際的鏈接看你不再是一個新的用戶? – 2013-08-22 16:09:35

18

正如kylehuff所述,您可以使用外部工具。但你可以使用谷歌瀏覽器的命令行來執行跨平臺的操作(Linux/Windows/Mac)。

chrome.exe --pack-extension=[extension_path] --pack-extension-key=[extension_key] 

--pack擴展是:

包從給定目錄的擴展,一個的.crx安裝文件。

--pack擴展鍵是:

可選PEM私鑰簽署打包的.crx使用。

以上不運行谷歌Chrome瀏覽器,它只是使用內部使用Chromium核心crx算法的命令行打包。

+9

如果您還使用--no-message-box選項,則該過程將完全靜音,適用於腳本。 – Marten 2011-10-31 10:06:51

+0

我有一個21的返回碼,但沒有crx文件。 – Natim 2017-03-16 11:25:49

+0

你能告訴我輸出文件在哪裏? – 2017-12-25 15:28:07

1
//Method to generate .crx. signature 


import java.nio.ByteBuffer; 
import java.nio.ByteOrder; 
import java.security.KeyPair; 
import java.security.KeyPairGenerator; 
import java.security.SecureRandom; 
import java.security.Signature; 
    //@param : extenstionContents is your zip file , 
    //@returns : byte[] of the signature , use ByteBuffer to merge them and you have your 
    // .crx 
    public static byte[] generateCrxHeader(byte[] extensionContents) throws Exception { 
     KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");  
     SecureRandom random = new SecureRandom(); 
     keyGen.initialize(1024, random);   

     KeyPair pair = keyGen.generateKeyPair(); 

     Signature sigInstance = Signature.getInstance("SHA1withRSA"); 
     sigInstance.initSign(pair.getPrivate()); 
     sigInstance.update(extensionContents); 
     byte [] signature = sigInstance.sign(); 
     byte [] subjectPublicKeyInfo = pair.getPublic().getEncoded(); 
     final int headerLength = 4 + 4 + 4 + 4 + subjectPublicKeyInfo.length + signature.length; 
     ByteBuffer headerBuf = ByteBuffer.allocate(headerLength); 
     headerBuf.order(ByteOrder.LITTLE_ENDIAN); 
     headerBuf.put(new byte[]{0x43,0x72,0x32,0x34}); // Magic number 
     headerBuf.putInt(2); // Version 
     headerBuf.putInt(subjectPublicKeyInfo.length); // public key length 
     headerBuf.putInt(signature.length); // signature length 
     headerBuf.put(subjectPublicKeyInfo); 
     headerBuf.put(signature); 
     final byte [] header = headerBuf.array(); 
     return header; 
    } 
+0

我認爲簽名和公鑰是crx可選的,但不是。這對我的解決方案而言是一個難題。 – 2016-11-04 17:04:44