Проверить сертификат и профиль обеспечения - PullRequest
17 голосов
/ 16 июля 2011

В наших проектах iOS мы предоставляем в хранилище контроля версий как сертификат подписи, так и профили обеспечения, используемые для создания сборок AdHoc и AppStore. Таким образом, всякий раз, когда новый разработчик загружает новую свежую копию приложения, у него есть все, что ему нужно для создания сборки AdHoc для тестировщиков.

Мы используем Jenkins для непрерывной интеграции, и я хотел бы иметь скрипт, который выполняет некоторые проверки работоспособности зафиксированных файлов. В частности, я хотел бы убедиться, что профили инициализации были действительно созданы с сертификатом подписи, зафиксированным в репозитории.

Кто-нибудь знает, как это сделать из командной строки? Я не могу понять формат файла .mobileprovision, хотя, похоже, это подписанный двоичный файл plist.

Ответы [ 2 ]

33 голосов
/ 22 июля 2011

Отвечая на мой собственный вопрос, я надеюсь, что это поможет кому-то еще.

Оказывается, файл mobileprovision представляет собой сообщение с цифровой подписью PKCS7.Он подписан не сертификатом разработчика, а сертификатом Apple.

Однако подписанные данные представляют собой XML-список, содержащий открытый ключ сертификата, который вы используете для подписи двоичных файлов.

Таким образом, в основном, следующие шаги:

  1. Извлечение данных из файла PKCS7.
  2. Извлечение открытого ключа из файла p12.
  3. Сравнитьдва и проверьте, совпадают ли они.

Мне удалось сделать это легко с Ruby, так как он предоставляет хорошие оболочки для OpenSSL.Я оставил скрипт в Github , если кто-то захочет его использовать.

Соответствующие части кода следующие:

profile = File.read(@profile_file)
certificate = File.read(@certificate_file)

p7 = OpenSSL::PKCS7.new(profile)
cert = OpenSSL::PKCS12.new(certificate, @certificate_password)

store = OpenSSL::X509::Store.new
p7.verify([], store)

plist = REXML::Document.new(p7.data)

plist.elements.each('/plist/dict/key') do |ele|
  if ele.text == "DeveloperCertificates"
    keys = ele.next_element
    key = keys.get_elements('//array/data')[0].text

    profile_cert = "-----BEGIN CERTIFICATE-----" + key.gsub(/\t/, "") + "-----END CERTIFICATE-----\n"

    @provisioning_cert = OpenSSL::X509::Certificate.new(profile_cert)
  end
end

# Compare @provisioning_cert.to_s and cert.certificate.to_s
3 голосов
/ 16 июля 2011

Вот запись в блоге, которую я нашел, которая объясняет структуру файла .mobileprovision: Структура файлов .mobileprovision и чтение

И вот как выглядят файлы csr: Что такое CSR (запрос на подпись сертификата)?

Я не думаю, что уже существует работающее решение, точно соответствующее вашим потребностям.Возможно, это не тот ответ, который вы искали, но я надеюсь, что вы как-нибудь найдете соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...