验证证书和配置文件

时间:2011-07-15 20:40:02

标签: iphone code-signing jenkins

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

我们正在使用Jenkins进行连续集成,我希望有一个脚本可以对提交的文件进行一些健全性检查。特别是,我想检查提交的配置文件确实是在存储库中提交的签名证书的情况下生成的。

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

2 个答案:

答案 0 :(得分:33)

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

事实证明,mobileprovision文件是PKCS7数字签名的消息。它没有使用开发人员的证书签名,而是使用Apple的证书。

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

基本上,步骤如下:

  1. 从PKCS7文件中提取数据。
  2. 从p12文件中提取公钥。
  3. 比较两者,并检查它们是否相同。
  4. 我设法用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
    

答案 1 :(得分:3)

以下是我发现的博客条目,解释了.mobileprovision文件的结构:.mobileprovision files structure and reading

那就是csr文件的样子:What is a CSR (Certificate Signing Request)?

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