Code Signing 探析
OS X上代碼簽名技術(shù)和響應的API是在Mac OS X Leopard 10.5上首次出現(xiàn)的(2007)石洗,iPhone是在眾多游戲主機之后第一個大規(guī)模出售并且從頭就開始使用代碼簽名的計算平臺羞延。只有在越獄之后,iOS才能運行沒有簽名的代碼梢睛,越獄使應用可以繞過代碼簽名和沙盒安全機制的全部限制肥印。
證書和密鑰
在開發(fā)時,開發(fā)使用的機器上應該有一個證書绝葡,一個公鑰深碱,一個私鑰,這是代碼簽名機制的核心藏畅。代碼簽名依賴于采用X.509標準的公開密鑰加密莹痢。
證書的組成:一個公鑰加上許多附加信息(被Certificate Authority)進行簽名認證過。認證的簽名有固定的有效期墓赴。
一般有兩個證書1竞膳、iPhone Developer 2、iPhone Distribution 前者用于使應用可以在你的測試設(shè)備上運行(Apple Developer Certificate(Submission))诫硕,后者是在提交到App Store時用到(Apple Developer Certificate(Development))坦辟。
簽名過程本身是由命令行工具codesign完成的Xcode中可進行以下設(shè)置。
一個已簽名應用的組成
一個已簽名的可執(zhí)行文件的簽名包含在Mach-O二進制文件格式中章办,例如腳本這樣的非Mach-O可執(zhí)行文件锉走,就存放在擴展屬性中。
程序包和其他資源文件
為了給所有文件設(shè)置簽名藕届,簽名的過程會在程序包中新建一個叫做_CodeSignatue/CodeResources的文件挪蹭,存儲了被簽名的程序包中所有文件的簽名。
在新版本的代碼簽名規(guī)定中休偶,一個程序包中的可執(zhí)行程序包梁厉,例如擴展 (extension),是一個獨立的需要設(shè)置簽名的個體,在檢查簽名是否完整時應當被單獨對待词顾。
授權(quán)機制(Entitlements)和配置文件(Provisioning)
授權(quán)機制決定了哪些系統(tǒng)資源在什么情況下允許被一個應用使用八秃。授權(quán)機制也是按照plist文件格式列出。Xcode會自動生成一個eletitlements文件肉盹,在需要的時候往里面添加條目昔驱。也會提交給codesign作為應用所需要擁有哪些授權(quán)的參考。在構(gòu)建應用時需要使用的授權(quán)文件可以在 Xcode build setting 中的 code signing entitlements 中設(shè)置上忍。
授權(quán)信息會被包含在應用的簽名信息中骤肛。授權(quán)信息列表會以Example.app.xcent這樣的名字的文件形式包含在應用包中
配置文件
配置文件(provisioning profiles):在整個代碼簽名和沙盒機制中有一個組成部分將簽名,授權(quán)和沙盒聯(lián)系了起來
一個配置文件中存放了系統(tǒng)用于判斷你的應用是否允許運行的信息
一個配置文件是一組信息的結(jié)合窍蓝,決定了某一個應用是否能夠在某一個特定的設(shè)備上運行腋颠。
配置文件可以用于讓應用在你的開發(fā)設(shè)備上可以被運行和調(diào)試,也可以用于內(nèi)部測試 (ad-hoc) 或者企業(yè)級應用的發(fā)布
~/Library/MobileDevice/Provisioning Profiles它抱。Xcode 將從開發(fā)者中心下載的全部配置文件都放在了這里
配置文件不是plist文件,是一個根據(jù)密碼訊息語法(Cryptographic Message Syntax)加密的文件,CMS.配置文件可以被設(shè)置簽名朴艰,但只在developer portal設(shè)置好的观蓄,iOS 用于判斷你的應用是否能運行在某個設(shè)備上真正需要的配置信息,每個配置文件都有自己的UUID祠墅,
DeveloperCertificates這項侮穿,這一項是一個列表,包含了可以為使用這個配置文件的應用簽名的所有證書毁嗦。
Certificate
證書是用來給應用程序簽名的亲茅,只有經(jīng)過簽名的應用程序才能保證來源可信任的,并且代碼是完整且未修改的狗准。
私鑰簽名克锣,公鑰驗證。
App ID
App ID用于標識一個或一組App腔长,應與Bundle ID一致或匹配的袭祟。
有兩種:1)Explicit App ID:唯一的ID,用于唯一標識一個應用程序
2)WildCard App ID:通配符ID捞附,用于標識一組應用程序巾乳,比如*可以標識所有應用程序
每創(chuàng)建一個App ID,都可以選擇該App ID所使用的APP Services鸟召,都有不同的額外要求胆绊。
Device
代表iOS設(shè)備,包含了該賬戶所有可用于測試和開發(fā)的設(shè)備欧募。使用UUID來唯一標識压状。
數(shù)量設(shè)備限制是100臺。
Provisioning Profile
包含了證書跟继、APP ID何缓、Device肢础。
也分為Development(一年)和Distribution(一年)兩種{In House,Ad Hoc碌廓, App Store}
設(shè)備限制不一樣
運行過程
開發(fā)/發(fā)布流程
申請證書
加入設(shè)備
生成Provisioning Profile(一般使用iOS Team Provisioning Profiel)
設(shè)置Xcode Code Sign Identifier
發(fā)布流程
創(chuàng)建發(fā)布證書
創(chuàng)建APP ID
創(chuàng)建Provisioning Profile
設(shè)置Bundle ID和APP ID一致
設(shè)置Xcode code signing Identifier传轰,選擇合適的證書和Profile進行簽名,打包