一尘不染

验证证书和配置文件

jenkins

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

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

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


阅读 240

收藏
2020-07-25

共1个答案

一尘不染

回答我自己的问题,希望对您有所帮助。

原来,该mobileprovision文件是PKCS7数字签名的消息。它不是用开发人员的证书签名的,而是用苹果公司的证书签名的。

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

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

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

我设法使用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
2020-07-25