1. 程式人生 > >iOS Code Signing: 解惑詳解

iOS Code Signing: 解惑詳解

唯一標識 解惑 並且 iphone 條件 等於 個人開發 視覺 電腦

原文鏈接地址:http://www.cnblogs.com/andyque/archive/2011/08/30/2159086.html

iPhone開發的代碼簽名 代碼簽名確保代碼的真實以及明確識別代碼的來源。在代碼運行在一個開發系統以前,以及在代碼提交到Apple發布以前,Apple要求所有的的應用程序都必須進行數字簽名。另外,Apple在發布每一個應用程序之前都要添加他自己的數字簽名。 數字簽名和簽名標識 Apple要求所有的iphone應用程序都需要使用apple提供給已註冊的iphone開發者的簽名許可進行數字簽名。這個簽名證明了該應用程序開發者的身份以及確保這個應用程序在簽名以後沒有被修改或者篡改過。 數字簽名使用兩種截然不同的方式,即:眾所周的公有密鑰和私有密鑰的算數關系加密術。私有密鑰使用在簽名的過程中。公有密鑰用來驗證這個簽名的有效性。公有簽名被存儲在簽名證書中,而私有簽名被單獨的存儲,這種證書和算數加密結合的私有密鑰被叫做數字標識或者簽名標識。 為iphone開發獲取簽名標識,你需要使用Keychain Access utility裏邊的Certificate Assistant來創建一個簽名許可請求Certificate Signing Request (CSR),你提交這個請求是希望得到使用iphone開發者計劃的計劃入口的正式許可。當你的請求被正式批準以後,下載這個證書文件,雙擊這個文件,就可以將其安裝到你的keychain(密鑰鏈中),在你使用Certificate Assistant utility生成一個簽名許可請求Certificate Signing Request (CSR)的過程中,這些你可能看得不太明顯,因為它自動生成了一對共有-私有密鑰。它包括發送給apple的許可請求中的公有密鑰(public key)和存儲在你的密鑰鏈(keychain)中的私有密鑰(private key)。 當你下載安裝簽名許可的時候, Keychain Access utility將其與私有密鑰關聯,以創建簽名標識。打開 Keychain Access utility 點擊 Category面板下的My Certificates 以察看許可的關聯私有密鑰。 當你安裝了已簽名的應用程序到你的iphone上去的時候,iphone OS 將要驗證簽名以確保該應用程序已簽名並在簽名以後未被篡改。如果簽名無效或者你根本就沒有簽名,iphone OS 將不允許該應用程序運行。 同樣,當你提交你的應用程序給apple 審批和部署的時候,首先,你必須用你的簽名標識為你的應用程序簽名,同時隨程序一起提交你的簽名證書。(私有密鑰不用提交至apple。)然後 Apple驗證該程序代碼是否來自有效的已註冊的開發者。 最後 Apple用她自己的簽名證書為你的已簽名的應用程序簽名。然後你的應用程序才能夠在iPhone ,iPod Touch上正常的運行。這種機制確保這些設備的擁有者從iTunes上邊下載的那些已註冊的開發者所編寫的應用程序的安全性,並且這些應用程序沒有被修改過。 將簽名標識復制到其他機器 如果你用來開發的機器不只一臺(例如,辦公電腦和你的家用筆記本電腦),你需要在兩臺上邊都有你的簽名標識。因為你從 程序門戶網站(Program Portal)上邊下載的簽名許可文件不包括你的私有密鑰,僅僅將這個簽名許可文件復制到你的另一臺電腦上是不夠的。你需要使用 Keychain Access 導出一個個人信息替換文件( Personal Information Exchange ),具體操作步驟如下 打開 Keychain Access,選擇 文件,導出項,(Keychain Access-> File-> Export Items )導出許可和私有密鑰作為你的個人信息替換文件,將其復制到另一臺機器上,雙擊這個文件將許可和密鑰導入到keychain下即可。 保持你的私有密鑰安全有效 只要你持有簽名標識,尤其是你的私有密鑰,這個系統將是非常安全的。然而如果有任何未經授權的人使用了你的簽名許可和私有密鑰,他們可以修改你的應用程序並且可以為這些修改代碼申請簽名,或者他們也可以以你的身份寫他們自己的應用程序。因此你的私有密鑰的自身安全是防止你的軟件和標識被惡意使用的最基本的手段。 在你獲取簽名標識和處理代碼簽名之前,你必須要確定你公司內誰將擁有這個標識,誰使用這個標識,以及如何保證這個標識的安全性。例如,如果這個標識一定是多人使用,你可以將其放置在一臺比較安全的電腦的keychain中,並且為keychain分配一個核實用戶身份用的密碼,或者你也可以將這個密鑰放置在一個用戶有PIN碼的smart卡中。 默認情況下,你的Keychain密碼和你的機器登陸密碼是相同的,並且只要你登陸到你的機器當中,keychain將保持解鎖狀態。這就等同於你將你的車鑰匙放在了後門旁邊的桌子上,並且後門整天都不上鎖。如果只有鑰匙能開你的車的話,你沒有有效的保護你的車鑰匙,怎麽能保證你的車的安全呢? 為了保證簽名標識的安全,以及其他一些keychain下的有價值的秘密信息的安全性,你至少應該采取如下措施:
  • 設置你的keychain在不使用的情況下自動加鎖:在 Keychain Access utility下,選擇Edit-> Change Settings for Keychain 並且勾選多選框(前兩項就可以了)。
  • 為你的Keychain使用一個不同於登陸密碼的密碼: 在 Keychain Access utility下,選擇Edit-> Change Password 來改變 Keychain 的密碼。在改變密碼對話框中勾選加鎖圖標來獲取密碼助手。要確保記住你修改後的密碼,並且不要隨便寫下你的密碼。另外,鑰保證你的電腦的物理安全,防止未授權的人員使用你的電腦。
像其他重要的數據一樣,你最好將簽名標識備份到一個安全的地方。你可以將其放到其他機器的keychain中,或者以個人信息替換文件( Personal Information Exchange (.p12) file )的方式存到一張加密的CD或者加密的硬盤鏡像中。確認你所使用的密碼都是健壯的,並且擁有簽名許可的電腦的物理安全(盡量不要允許未信任的人員使用他們)。 從哪裏開始? iPhone Developer Program 網站上有詳細的獲取和安裝簽名標識的規程,點擊 iPhone DevCenter 頁右上角的網站圖標。(你需要一個登陸進去,這個連接才會有效。) 獲取更多關於數字簽名,加密密鑰以及證書許可等信息,請訪問 Security Overview and Code Signing Guide. Security Overview http://developer.apple.com/documentation/Security/Conceptual/Security_Overview/Introduction/chapter_1_section_1.html Code Signing Guide http://developer.apple.com/documentation/Security/Conceptual/CodeSigningGuide/Introduction/chapter_1_section_1.html 原文鏈接地址:http://www.cnblogs.com/andyque/archive/2011/08/30/2159086.html 教程截圖: 技術分享
下面是一篇有澳洲墨爾本的一名全職iOS開發者提供的文章。他在論壇上是一個很摩登的年輕人 – Adam Eberbach。   ·Bundle identifier   ·provisioning profiles   ·App ID   ·certificate signing request   對於新手,的確很難一口氣搞清楚這些東東到底有什麽區別。   下面我們來揭開它們的神秘面紗,在讀完這篇文章後,你應該可以把這些東西聯系起來,你能夠理解它們是怎麽工作,並能夠順利地在device上運行你的應用了。   當然,這裏假設你已經是一個iOS開發者,擁有IDP,並已經有一定的xcode和iOS開發經驗了。如果你只是剛剛開始學習iOS,你可以先看看其它入門教程。   好吧,我們開始了。

它們有多重要?

  Code signing 對你來說,最主要的意義就是它能讓你的App在設備上運行。不管是你自己的設備,甲方客戶的,還是在App store上購買你的消費者。   如果沒有code signing,你只可以在模擬器上,或者一臺越獄過的機器上運行你的應用----當然,僅僅如此是不能滿足我們的。   模擬器的測試僅僅是一種初步測試,模擬器不能替代真機調試,因為: ·真正的設備會通常比模擬器慢   模擬器使用的是你的MAC機上的處理器,而一臺真正的iphone可遠遠沒有這種條件。所以如果你不在設備上真正運行,你可能就會忽略實際的性能問題。   比如你新建一個ViewBased應用,然後在viewDidLoad裏面加入下列代碼:
int count =200000;
NSMutableArray * array = [NSMutableArray arrayWithCapacity:count];
for (int i =0; i < count; ++i) {
[array addObject:[NSString stringWithFormat:@"%d", i]];
}
上面這段代碼在模擬器上可能1-2秒就能運行完,但是在真機上面(比如iphone 3GS),大約要花7秒左右的時間。 ·設備的內存少很多   同理的,模擬器使用你MAC上的內存,而一臺真正的iphone的內存少得多。   特別是遊戲,通常會使用大量的圖片,占用大量的內存。在老一點型號的機器上,一個紋理圖片的大小上限是24MB,也就是1024X1024的8bit紋理圖。   內存耗盡絕對是你不想見到的,因為占用的內存超過一定範圍,OS會強行退出你的app,對用戶來說,就認為是你的app崩潰了。 ·有些API只在設備上有效   譬如In-App purchase的API,或者Instrument中的Core Animation。這些都要在真機上測試出來。(可能以後版本的iOS或者xcode能夠支持,但畢竟真機測試是一種保障)   總的來說,你沒有在真機上測試過,等於你沒有真的測試完。 ·(譯者註:一些視覺上的效果在模擬器上看到的可能會與真機不一致)   在Xcode中有一些懶人的方法:   在organizer的界面中,選中devices 右鍵Developer Profile,你可以看到這樣一個菜單。   裏面有大部分這篇文章將要講到的內容。 技術分享   這裏你可以sign in你的開發者賬號,自動登記你的app並運行到你的device上。   當然,如果這樣總是好用的話,這篇文章就沒有意義了。   作為一個開發者,你應該知道更多。

Public and Private Keys 公鑰私鑰

  在繼續剖析之前,我們先簡單地解析公鑰私鑰。   這世上有兩種加密方法:symmetric cryptography 對稱密碼和 asymmetric cryptography非對稱密碼。   對於對稱密碼,只有一種key。譬如你有一個密鑰,以及對應的一個加密過的信息。   那只有知道密鑰的人可以解讀這個信息。   對於非對稱密碼,有兩個key – 公鑰和私鑰。   譬如你用某個私鑰加密一些信息,別人收到這個信息後可以通過那個私鑰對應的公鑰來加密。這樣他們就可以肯定,這個信息是從你那裏來的(至少是你加密的)。   這個私鑰就相當於一個“簽名”。 (你加的密,就是你簽的字)   而這個,就是在iOS中code signing背後的原理。

Code Signing Objects

  與Code Signing有關的東西有 :   Provisioning Profiles,App IDs,UDIDs …   在這一節,我們會一個一個地解說。   我用Core Data繪制了一個圖表,用來描述這些對象之間的關系。 技術分享   這是針對開發人員的 (Development Profile),發布人員的圖會有小小區別。

私鑰 Private Key:

  在Mac OS X 以後,key由一個叫做 Keychain的app來管理。 你可以在 Application\Utilities 中找到。 運行Keychain,你可以看到在你的名下有哪些公鑰和私鑰。類似這樣的: 技術分享 (這是私隱,要加碼的)   如果你沒有看到任何key的列表,不用擔心。在你第一次使用認證的時候,Keychain會幫你創建。   在這裏列出的key是你的provisioning或者code signing的基礎。   你必須有key才能sign code或者在App store中發布你的app。   如果key丟失了?   你必須把整個流程重新做一次 – 因為沒有key,你的認證不再有效,你的provisioning profile只會生成error。你會浪費很多時間,所以,好好保管它。   如果你沒有備份過,我建議你馬上把它export出來,通過File\Export Items ,保存在一個安全的地方,例如一個很小的分區中。或者通過你的Mobile Me賬號來同步保存。

有多個Key?

  如果你在不同的Mac機上創建過account,你將會有多個key。   這樣會帶來一個問題,在機器A上生成的認證,在沒有私鑰的機器B上會失效。   所以,你可以把你所有的key復制到你所有的Mac機上。(這樣就不用煩了)   或者,我更建議只用一個Key。

UDID

  UDID (Unique Device Identifier)是區分物理設備的唯一標識。   所有你的iPhone肯定有一個與眾不同的UDID,包括你的iPad等等。   通常,UDID會是一個40位十六進制字符串。   也就是下圖的identifier: 技術分享   如果App不是從app store上來,你的代碼需要有UDID的信息才能運行。   怎麽知道你擁有的設備的UDID?有幾個方法。   1 如果你的設備連到Xcode的機器上,你可以在Organizer中看到UDID。   2 沒有xcode的朋友也可以,在iTunes的 Summary界面,有serial number(序列號)的信息,點擊可以看到。 技術分享   3 這是最簡單的方法,在App Store中下載一個Ad Hoc Helper吧。

Certificate 認證

  認證,就是你的個人開發者認證,或者更華麗地說:“Apple Worldwide Developer Relations Certification Authority Certificate”(這不翻譯了),   這個本質上就是一些代表著信任-授權的數據而已。   獲取一個認證,你需要子啊Keychain Access中生成一個 Certificate Signing Request,並把它發給Apple。這會創建一對 公鑰-私鑰(如果還沒有的話)。   Apple收到後會驗證信息,然後給你創建一個認證。

App ID

  在Xcode4中創建一個項目,你要提供 Product Name 和 Company Identifier的信息。   Product Name,就是你的app的一個較短的名稱。   Company identifier,通常會是一個反轉的DNS串,例如:com.mycompanyname   這兩者合起來,就似乎Bundle Identifier。你會在Info.plist中找到。   對於每一個你要發布的app,你需要到iTunes Developer Center中註冊你的App ID。如下圖。 技術分享   這個需要與你在Info.plist中設置的保持一致。

Provisioning Profile

  把前面講到的東西合起來:   ·App ID (app的唯一標識)   ·UDID (在某臺設備上運行的唯一標識)   ·Certificate (開發者認證)   就是所謂的Provisioning Profile。   Provisioning Profile 通過xcode或者itunes導入到device中,或者打包到一個包含app和profile的.ipa文件中。   你可以在iOS Provisioning Portal 中創建你的Provisioning Profile。 技術分享   新建一個,有一下幾個步驟:   ·為profile命名,以後你會在xcode的organizer,Buid Settings 以及其它一些地方中看到   ·選擇你的certificate   ·選擇你的App ID,要如Info.plist中的一致。   ·選擇要應用到的設備。通常,我都是把我的設備全選的。

個人用途的簽名 Signing

  假設你已經有一個準備測試的App,而你有IDP,並且處理好Provisioning Profile的事情了。   現在你清楚已經知道它們的邏輯了,如果你新加入,下面這些是你要做的:   1 檢查你的公鑰私鑰,為以後檢查方便,起個好名吧。   2 用Keychain Access來創建你的開發認證。然後下載Apple給你的認證,雙擊安裝,然後你可以在Keychain中看到了吧。   3 下載“Apple Worldwide Developer Relations Certification Authority Certificate”(WWDR)也是雙擊安裝,也可以到Keychain中看到。   4 檢查你項目的Bundle ID,到Provisioning Portal中創建一個一致的App ID。   5 在Provisioning Portal中加入你想要的UDID。(全部加上好了)   6 針對你的Certificate創建Provisioning Profile, 指定你的app ID 和UDID。   7 下載剛剛創建的Profile,拖到你的xcode Organizer中。   然後,你就可以sign你的project,並讓它們在你的device上運行了。   在Target – Build Settings ,往下滾動到 Code Signing一節。   試試編輯一下Debug schema,它適合於團隊協作:   在Automatic ProfileSelector中選擇“iPhone Developer”,你會看到你的認證已經自動選上了。   一切都搞定了,連接你的device,在xcode中選擇Debug build,build & run。   xcode會到你的設備裏裝上這個provisioning profile,並運行你的App。

iOS Code Signing: 解惑詳解