Проверка сертификата и профиля обеспечения

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

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

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

Ответы

Ответ 1

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

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

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

Итак, в основном, следующие шаги:

  • Извлеките данные из файла PKCS7.
  • Извлеките открытый ключ из файла p12.
  • Сравните эти два и проверьте, совпадают ли они.

Мне удалось сделать это с Ruby, так как он предоставляет хорошие обертки для OpenSSL. Я оставил script в 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

Ответ 2

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

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

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