2011-07-15 119 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