Как создать файл chrome crx программно (желательно в java)?

Я хочу создать файл crx расширения chrome программно (не используя chrome.exe, потому что он открывает новое окно Chrome). Итак, каковы альтернативы для того же самого? Я предпочитаю java, но если это возможно на другом языке, то я тоже в порядке.


person Silent Warrior    schedule 07.07.2010    source источник
comment
У меня была аналогичная проблема, вот решение: stackoverflow.com/questions/24661167/   -  person JavaHead    schedule 11.07.2014


Ответы (4)


Для этого существует множество утилит на разных языках (хотя в основном это языки оболочки/скриптов).

Я не могу опубликовать ссылки на все из них, потому что я новый пользователь stackoverflow - я могу опубликовать только 1 ссылку, поэтому я создал страницу, на которой перечислены все, включая ту C, о которой я говорю ниже - http://curetheitch.com/projects/buildcrx/6/

В любом случае, я потратил несколько часов и собрал версию на C, которая работает в Windows или Linux, так как другие решения требуют установки языка сценариев или оболочки (например, python, ruby, bash и т. д.) и OpenSSL. Утилита, которую я написал, имеет статически связанный OpenSSL, поэтому нет требований к интерпретатору или библиотеке.

Репозиторий размещен на github, но по ссылке выше есть список моей утилиты и других решений.

Ничего не указано для Java, которую вы предпочли, но, надеюсь, это поможет!

person kylehuff    schedule 11.10.2010
comment
Именно то, что я искал. Спасибо. - person Keith Bentrup; 15.08.2011
comment
Я знаю, что это старо, но это мне очень помогло! - person hawkfalcon; 13.05.2012
comment
Можете ли вы обновить свой ответ, указав фактические ссылки, поскольку вы больше не новый пользователь? - person Mihai Danila; 22.08.2013

Как сказал Кайлехафф, есть внешние инструменты, которые вы могли бы использовать. Но вы всегда можете использовать командную строку из Google Chrome, чтобы делать то, что является кросс-платформенным (Linux/Windows/Mac).

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

--pack-extension:

Упакуйте расширение в установочный файл .crx из заданного каталога.

--pack-extension-key:

Необязательный закрытый ключ PEM используется для подписания упакованных файлов .crx.

Вышеприведенное не запускает Google Chrome, это просто упаковка командной строки с использованием основного алгоритма crx Chromium, который они используют внутри.

person Mohamed Mansour    schedule 11.10.2010
comment
Если вы также используете параметр --no-message-box, процесс будет полностью бесшумным, подходящим для использования в сценарии. - person Marten; 31.10.2011
comment
У меня есть код возврата 21, но нет файла crx. - person Natim; 16.03.2017
comment
Не могли бы вы сказать мне, где находится выходной файл? - person Suraj Jain; 25.12.2017
comment
Вам нужно включить версию в [extension_path]. Файл создается в каталоге верхнего уровня. Например, команда chrome --pack-extension=/path/to/chrome-profile/Extensions/pehaalcefcjfccdpbckoablngfkfgfgj/1.1_0 создает файл по адресу /path/to/chrome-profile/Extensions/pehaalcefcjfccdpbckoablngfkfgfgj/1.1_0.crx. - person Johannes Barop; 29.11.2018

Мне нужно было сделать это в Ruby. Ответ JavaHead выглядит хорошо для Java для CRX2. Текущий формат — CRX v3, а заголовок основан на protobuf. Я написал блог для упаковки расширения с Руби. Существует также проект python от другого автора.

Я вставлю здесь Ruby-версию методов CRX2 и CRX3 для упаковки расширений для справки. Полный код смотрите в моем блоге.

Итак, метод 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 при запуске теста. Для нормальной загрузки необходимо опубликовать в интернет-магазине.

person akostadinov    schedule 23.11.2019

person    schedule
comment
Я думал, что подпись и открытый ключ не являются обязательными для crx, но это не так. Для моего решения отсутствовала головоломка. - person San Droid; 04.11.2016
comment
к сожалению, версия 2 crx больше не поддерживается - person spy; 12.12.2019