iOS Code Signing: 解惑詳解

來源:互聯網
上載者:User

標籤:個人資訊   iphone應用   vcenter   end   chap   包括   document   自動產生   mat   

原文連結地址: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 Overviewhttp://developer.apple.com/documentation/Security/Conceptual/Security_Overview/Introduction/chapter_1_section_1.htmlCode Signing Guidehttp://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: 解惑詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.