Part.1 什么是Provisioning Profile
當你接觸iOS開發(fā),一般都會涉及到Provisioning Profile(配置文件)。大多數(shù)時候是通過蘋果的“Development Provisioning Assistant”,將配置文件安裝到正確的地方,并使用Keychain Access(鑰匙串訪問程序)獲取證書和密鑰,并將其安裝到鑰匙串中。一段時間過后,你可能會遇到如下問題:
Code Sign error(代碼簽名錯誤):
The executable was signed with invalid entitlements.(使用了無效的證書對程序進行了簽名)
Valid signing identity not found.(沒有找到有效的簽名標示)
No unexpired provisioning profiles found that contain any of the keychain’s signing certificates(在鑰匙串的簽名證書中,沒有發(fā)現(xiàn)期望的配置文件)
遇到上面的問題后,你可能通過google,在Stack Overflow上找到一些類似的問題,并成功把問題解決掉,然后接著做別的任務。我見過解決上面問題的方法是“刪除所有的配置文件,并重頭開始”。一般這是可以解決問題的,不過本系列文章的目標是讓你不用刪除所有的配置文件從頭開始,就可以解決上面的問題。
開始吧
每個配置文件實際上都是一個用PKCS#7簽名后的plist文件。PKCS一組公鑰密碼學標準。PKCS#7是加密消息語法的標準。蘋果使用這個標準對plist文件進行簽名,通過簽名,OS(操作系統(tǒng))可以驗證被安裝的程序是來自合法的開發(fā)者(通過驗證可以知道plist文件中的內容有沒有被修改過)。plist文件中的最后一部分是非常重要的,稍后你將知道為什么。
在Terminal(終端程序)中使用vi打開一個配置文件,可以看到類似如下的內容:
0<82>^^è^F *<86>H<86>÷^M^A^G^B <82>^^Ù0<82>^^Õ^B^A^A1^K0 ^F^E+^N^C^B^Z^E^@0<82>^N®^F *<86>H<86>÷^M^A^G^A <82>^N<9f>^D<82>^N<9b><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
上面這部分內容是PKCS#7簽名的頭部。往下看到的許多內容才是真正的簽名:
</dict>
</plist>
<82>^M²0<82>^Cù0<82>^Bá ^C^B^A^B^B^A^_0^M^F *<86>H<86>÷^M^A^A^E^E^@0y1^K0 ^F^CU^D^F^S^BUS1^S0^Q^F^CU^D
^S
Apple Inc.1&0$^F^CU^D^K^S^]Apple Certification Authority1-0+^F^CU^D^C^S$Apple iPhone Certification Authority0^^^W^M080521020415Z^W^M200521020415Z0Y1^K0 ^F^CU^D^F^S^BUS1^S0^Q^F^CU^D
^S
Apple Inc.1503^F^CU^D^C^S,Apple iPhone OS Provisioning Profile Signing0<82>^A"0^M^F *<86>H<86>÷^M^A^A^A^E^@^C<82>^A^O^@0<82>^A
注意觀察上面內容的底部,可以看到類似這樣的字符串:Apple Inc., Apple Certification Authority 和 Apple iPhone OS Provisioning Profile Signing,通過這些內容可以知道這個文件進行了數(shù)字簽名。配置文件是通過iOS Provisioning Portal創(chuàng)建的。當你選擇了App ID,以及適當數(shù)量的設備UDIDs和Entitlement之后,蘋果會將所有的這些信息數(shù)字簽名到配置文件(Provisioning Profile)中,這樣iOS就可以驗證配置文件是否真的由蘋果分發(fā)。
當這個配置文件被數(shù)字簽名之后,你可能會問“我如何驗證這個簽名?”,在Terminal程序中,你可以使用openssl程序進行驗證。Openssl不僅可以驗證簽名,還可以將簽名信息打印出來,在Terminal程序中輸入如下內容就可以進行驗證:
openssl smime -in /path/to/your.mobileprovision -inform der -verify
現(xiàn)在,如果你希望手動編輯一下配置文件。比如你想把蘋果新設備的UDID添加到配置文件中(不通過Provisioning Portal)。編輯之后,驗證會失敗,并得到如下類似的信息:
openssl smime -in Key_Grinder_Beta_Dev.mobileprovision -inform der -verify
Error reading S/MIME message
10163:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:/SourceCache/OpenSSL098/OpenSSL098-47/src/crypto/asn1/tasn_dec.c:1315:
10163:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:/SourceCache/OpenSSL098/OpenSSL098-47/src/crypto/asn1/tasn_dec.c:657:Field=signer_info, Type=PKCS7_SIGNED
10163:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1 error:/SourceCache/OpenSSL098/OpenSSL098-47/src/crypto/asn1/tasn_dec.c:747:
10163:error:0D08403A:asn1 encoding routines:ASN1_TEMPLATE_EX_D2I:nested asn1 error:/SourceCache/OpenSSL098/OpenSSL098-47/src/crypto/asn1/tasn_dec.c:577:Field=d.sign,Type=PKCS7
這還不是我見過最好的錯誤(蘋果限制了每個開發(fā)者賬號只能最多使用100臺設備,并防止你添加更多的UDIDs)
本文介紹了一個配置文件的基本知識。下一篇文章將深入介紹plist文件中的內容——這些信息對你的程序和Xcode意味著什么呢?
來源:破船的博客