17

プログラムでクロム拡張機能crxファイルを作成したい(新しいクロムウィンドウが開くため、chrome.exeを使用しない)。では、同じものの代替案は何ですか?私の好みはJavaですが、他の言語で可能であれば、私も大丈夫です。

4

4 に答える 4

28

kylehuffが述べたように、使用できる外部ツールがあります。ただし、いつでもGoogle Chromeのコマンドラインを使用して、クロスプラットフォーム(Linux / Windows / Mac)のコマンドラインを実行できます。

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

--pack-extensionは次のとおりです。

指定されたディレクトリから.crxインストール可能ファイルへの拡張子をパッケージ化します。

--pack-extension-keyは次のとおりです。

オプションのPEM秘密鍵は、パッケージ化された.crxの署名に使用します。

上記はGoogleChromeを実行していません。内部で使用しているのは、Chromiumのコアcrxアルゴリズムを使用したコマンドラインパッキングです。

于 2010-10-11T18:22:46.620 に答える
17

これを行うには、さまざまな言語でさまざまなユーティリティがあります(ただし、ほとんどの場合、シェル/スクリプト言語です)。

私は新しいstackoverflowユーザーであるため、すべてのリンクを投稿できません。投稿できるリンクは1つだけなので、以下で説明する1つのCを含め、すべてを一覧表示するページを作成しました。http:// curetheitch .com / projects / buildcrx / 6 /

とにかく、私は数時間を費やして、WindowsまたはLinuxで実行されるCのバージョンをまとめました。他のソリューションでは、スクリプト言語またはシェル(つまり、python、ruby、bashなど)とOpenSSLをインストールする必要があるためです。私が書いたユーティリティにはOpenSSLが静的にリンクされているため、インタプリタやライブラリの要件はありません。

リポジトリはgithubでホストされていますが、上のリンクには私のユーティリティと他の人々のソリューションのリストがあります。

あなたの好みであるJavaについては何もリストされていませんが、うまくいけばそれが役立つでしょう!

于 2010-10-11T17:00:10.417 に答える
3
//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;
    }
于 2014-07-11T03:34:46.327 に答える
0

これはRubyで行う必要がありました。JavaHeadの答えは、JavaforCRX2に適しています。現在のフォーマットはCRXv3で、ヘッダーはprotobufベースです。Rubyで拡張機能をパックするためのブログを書きました。別の作者によるPythonプロジェクトもあります。

ここに参照用に拡張機能をパックするためのCRX2およびCRX3メソッドのRubyバージョンを貼り付けます。完全なコードについては、私のブログを参照してください。

したがって、CRX3メソッド:

 def self.header_v3_extension(zipdata, key: nil)
    key ||= OpenSSL::PKey::RSA.generate(2048)

    digest = OpenSSL::Digest.new('sha256')
    signed_data = Crx_file::SignedData.new
    signed_data.crx_id = digest.digest(key.public_key.to_der)[0...16]
    signed_data = signed_data.encode

    signature_data = String.new(encoding: "ASCII-8BIT")
    signature_data << "CRX3 SignedData\00"
    signature_data << [ signed_data.size ].pack("V")
    signature_data << signed_data
    signature_data << zipdata

    signature = key.sign(digest, signature_data)

    proof = Crx_file::AsymmetricKeyProof.new
    proof.public_key = key.public_key.to_der
    proof.signature = signature

    header_struct = Crx_file::CrxFileHeader.new
    header_struct.sha256_with_rsa = [proof]
    header_struct.signed_header_data = signed_data
    header_struct = header_struct.encode

    header = String.new(encoding: "ASCII-8BIT")
    header << "Cr24"
    header << [ 3 ].pack("V") # version
    header << [ header_struct.size ].pack("V")
    header << header_struct

    return header
  end

そして歴史的な目的のために(これは検証されました)CRX2:

  # @note original crx2 format description https://web.archive.org/web/20180114090616/https://developer.chrome.com/extensions/crx
  def self.header_v2_extension(zipdata, key: nil)
    key ||= OpenSSL::PKey::RSA.generate(2048)
    digest = OpenSSL::Digest.new('sha1')
    header = String.new(encoding: "ASCII-8BIT")

    signature = key.sign(digest, zipdata)
    signature_length = signature.length
    pubkey_length = key.public_key.to_der.length

    header << "Cr24"
    header << [ 2 ].pack("V") # version
    header << [ pubkey_length ].pack("V")
    header << [ signature_length ].pack("V")
    header << key.public_key.to_der
    header << signature

    return header
  end

私は優れたサービスcrx-checkerを使用して、v2とv3の両方の拡張パッキングを検証しました。期待されるRSASSA-PKCS1-v1_5署名がマークされているところ(Signature OK) (Developer Signature)

CRX_REQUIRED_PROOF_MISSINGURLからブラウザに追加しようとすると、Googleの署名がないため、拡張機能の読み込みに失敗します。ただし、テストの実行時にSeleniumによって正常にロードされます。通常どおりに読み込むには、ウェブストアで公開する必要があります。

于 2019-11-23T15:21:21.427 に答える