iphone - 验证证书和配置文件

标签 iphone code-signing jenkins

在我们的 iOS 项目中,我们将用于生成 AdHoc 和 AppStore 版本的签名证书和配置文件都提交到版本控制存储库。这样,每当新开发人员下载应用程序的新副本时,他就拥有为测试人员创建 AdHoc 构建所需的一切。

我们正在使用 Jenkins 进行持续集成,我想要一个脚本来对提交的文件进行一些健全性检查。特别是,我想检查提交的配置文件是否确实是使用存储库中提交的签名证书生成的。

有人知道如何从命令行执行此操作吗?我无法弄清楚 .mobileprovision 文件格式,尽管它似乎是一个签名的二进制 plist 文件。

最佳答案

回答我自己的问题,我希望这对其他人有帮助。

事实证明,mobileprovision 文件是经过 PKCS7 数字签名的消息。它不是用开发者的证书签名的,而是用 Apple 的证书签名的。

但是,签名的数据是一个 XML plist,其中包含用于对二进制文件进行签名的证书的公钥。

基本上,步骤如下:

  1. 从 PKCS7 文件中提取数据。
  2. 从 p12 文件中提取公钥。
  3. 比较两者,检查它们是否相同。

我设法使用 Ruby 轻松完成此操作,因为它为 OpenSSL 提供了很好的包装器。我留下了script in 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

关于iphone - 验证证书和配置文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6712895/

相关文章:

安装和升级插件后 Jenkins 作业消失

iphone - iOS 4.2 中未调用 viewWillAppear 方法

ios - 如何使用循环在行中仅显示 3 个按钮,在列中仅显示一个按钮

iphone - 在多个源代码中将 ObjC 和 C++ 与 C++ 模板类混合

ios - 新计算机上的 "Valid signing identity not found"

ios - FaSTLane 设置 - 致命 : could not read Password for 'https://<org>@dev.azure.com' : terminal prompts disabled

ios - 如何在 iOS 的 Realm 中使用主键( objective-c )

android - 在已签名的应用程序中看不到 Google map

jenkins - 如何使用 Ansible 重新启动 Jenkins 并等待它回来?

java - 如何从Java应用程序获取Jenkins环境变量?