プログラムでクロム拡張機能crxファイルを作成したい(新しいクロムウィンドウが開くため、chrome.exeを使用しない)。では、同じものの代替案は何ですか?私の好みはJavaですが、他の言語で可能であれば、私も大丈夫です。
4 に答える
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アルゴリズムを使用したコマンドラインパッキングです。
これを行うには、さまざまな言語でさまざまなユーティリティがあります(ただし、ほとんどの場合、シェル/スクリプト言語です)。
私は新しいstackoverflowユーザーであるため、すべてのリンクを投稿できません。投稿できるリンクは1つだけなので、以下で説明する1つのCを含め、すべてを一覧表示するページを作成しました。http:// curetheitch .com / projects / buildcrx / 6 /
とにかく、私は数時間を費やして、WindowsまたはLinuxで実行されるCのバージョンをまとめました。他のソリューションでは、スクリプト言語またはシェル(つまり、python、ruby、bashなど)とOpenSSLをインストールする必要があるためです。私が書いたユーティリティにはOpenSSLが静的にリンクされているため、インタプリタやライブラリの要件はありません。
リポジトリはgithubでホストされていますが、上のリンクには私のユーティリティと他の人々のソリューションのリストがあります。
あなたの好みであるJavaについては何もリストされていませんが、うまくいけばそれが役立つでしょう!
//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;
}
これは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_MISSING
URLからブラウザに追加しようとすると、Googleの署名がないため、拡張機能の読み込みに失敗します。ただし、テストの実行時にSeleniumによって正常にロードされます。通常どおりに読み込むには、ウェブストアで公開する必要があります。