2010-07-07 56 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