2011-07-15 121 views
16

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

我们正在使用詹金斯持续集成,我想有一个脚本,并在COMMITED一些文件完整性检查。特别是,我想检查提交的配置文件是否确实是使用存储库中提交的签名证书生成的。

有谁知道如何在命令行中做到这一点?我找不到.mobileprovision文件格式,虽然它似乎是一个有符号的二进制plist文件。

回答

30

回答我的问题,我希望这可以帮助别人。

事实证明,mobileprovision文件是一个PKCS7数字签名的邮件。它没有与开发人员的证书签署,但与苹果的证书。

不过,如果是签名的数据是包含您用来登入您的二进制文件证书的公钥的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 
2

这里是一个博客条目,我发现,解释了文件名为.mobileprovision的结构:.mobileprovision files structure and reading

怎么CSR文件看起来像多数民众赞成:What is a CSR (Certificate Signing Request)?

我不认为这已经是一个有那里的工作解决方案完全符合您的需求。这可能不是你正在寻找的答案,但我希望你能以某种方式找到联系。

+0

这可以帮助,但它不正是我要找的。我认为配置文件只是用证书签名。如果我们只能找到应用的签名,并验证签名身份,那就太棒了。 – pgb

+0

第一个链接现在已经死了 - 这里是它的存档版本。 https://web.archive.org/web/20130502092617/http://idevblog.info/mobileprovision-files-structure-and-reading – Stevko