我需要用Ruby来完成这个任务。JavaHead的答案看起来适用于CRX2的Java版本。当前格式是CRX v3,头部基于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)。
如果您尝试从URL添加到浏览器中,该扩展将因缺少Google签名而无法加载,并显示CRX_REQUIRED_PROOF_MISSING。但是,在运行测试时,Selenium可以正常加载它。要正常加载,您需要在Web商店上发布。