Отвечая на мой собственный вопрос, я надеюсь, что это поможет кому-то еще.
Оказывается, файл mobileprovision
представляет собой сообщение с цифровой подписью PKCS7.Он подписан не сертификатом разработчика, а сертификатом Apple.
Однако подписанные данные представляют собой XML-список, содержащий открытый ключ сертификата, который вы используете для подписи двоичных файлов.
Таким образом, в основном, следующие шаги:
- Извлечение данных из файла PKCS7.
- Извлечение открытого ключа из файла p12.
- Сравнитьдва и проверьте, совпадают ли они.
Мне удалось сделать это легко с 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