Iphone 验证证书和配置文件

Iphone 验证证书和配置文件,iphone,code-signing,jenkins,Iphone,Code Signing,Jenkins,在我们的iOS项目中,我们向版本控制存储库提交用于生成临时和AppStore构建的签名证书和配置文件。这样,每当新开发人员下载新的应用程序副本时,他就拥有为测试人员创建临时构建所需的一切 我们正在使用Jenkins进行持续集成,我希望有一个脚本对提交的文件进行一些健全性检查。特别是,我想检查提交的配置文件是否确实是使用存储库中提交的签名证书生成的 有人知道如何从命令行执行此操作吗?虽然.mobileprovision文件似乎是一个有符号的二进制plist文件,但我无法确定它的格式。我找到了一篇博

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

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


有人知道如何从命令行执行此操作吗?虽然.mobileprovision文件似乎是一个有符号的二进制plist文件,但我无法确定它的格式。

我找到了一篇博客文章,解释了.mobileprovision文件的结构:

这就是csr文件的外观:


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

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

事实证明,
mobileprovision
文件是一条PKCS7数字签名消息。它不是用开发者的证书签署的,而是用苹果的证书

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

因此,基本上,步骤如下:

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
  • 从PKCS7文件中提取数据
  • 从p12文件中提取公钥
  • 比较两者,并检查它们是否相同
  • 我用Ruby很容易做到这一点,因为它为OpenSSL提供了很好的包装。我留下了一个,如果有人想用的话

    守则的有关部分如下:

    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
    

    这很有帮助,但这不是我想要的。我认为配置文件只是用证书签名的。如果我们只能找到应用的签名,并验证签名身份,那就太好了。第一个链接现在已失效-这是它的存档版本。