Android手機操做系統做爲一款比較流行的開源系統在手機領域佔據着舉足輕重的地位。 在Android系統中,全部安裝到系統的應用程序都必有一個Android數字證書,此數字證書用於標識應用程序的做者和在應用程序之間創建信任關係,若是一個permission的protectionLevel爲signature,那麼就只有那些跟該permission所在的程序擁有同一個數字證書的應用程序才能取得該權限。java
Android使用Java的數字證書相關的機制來給apk加蓋數字證書,要理解Android數字證書,須要先了解如下數字證書的概念和java的數字證書機制。android
基礎概念:數字證書:算法
數字證明是採用數字手段來證明用戶身份的一種方法。數字證書含有兩部分數據:一部分是對應主體(單位或我的)的信息,另外一部分是這個主體所對應的公鑰。即數字證書保存了主體和它的公鑰的一一對應關係,用於自我認證(向其餘的用戶證實本身的身份)。模塊化
Java數字證書工具。工具
Java中的keytool.exe能夠用來建立數字證書,全部的數字證書是以一條一條(採用別名區別)的形式存入證書庫的中,證書庫中的一條證書包含該條證書的私鑰,公鑰和對應的數字證書的信息。證書庫中的一條證書能夠導出數字證書文件,數字證書文件只包括主體信息和對應的公鑰。開發工具
每個證書庫是一個文件組成,它有訪問密碼,在首次建立時,它會自動生成證書庫,並要求指定訪問證書庫的密碼。加密
在建立證書的的時候,須要填寫證書的一些信息和證書對應的私鑰密碼。這些信息包括 CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx,它們的意思是:操作系統
CN(Common Name名字與姓氏)插件
OU(Organization Unit組織單位名稱)命令行
O(Organization組織名稱)
L(Locality城市或區域名稱)
ST(State州或省份名稱)
C(Country國家名稱)
能夠採用交互式讓工具提示輸入以上信息,也能夠採用參數
-dname "CN=xx,OU=xx,O=xx,L=xx,ST=xx,C=xx"來自動建立。
例如這條命令:
keytool -genkey -alias testCA -keyalg RSA -keysize 1024 -keystore testCALib -validity 3650
在數字證書庫testCALib中建立了一個別名爲testCA,使用RSA算法加密的,有效期爲3650天的數字證書。
證書生成之後,咱們可使用命名將數字證書導出爲一個文件。
keytool -export -alias testCA -file testCA.cer -keystore testALib -rfc
有關keytool的其餘用法能夠查詢keytool的幫助文檔。
數字證書生成之後,咱們須要使用生成的數字證書給程序包簽名,這個是使用jarsigner 工具。例如,若是咱們有一個android的程序包calendar.apk.,咱們就可使用剛生成的testCA給改程序包簽名。
jarsigner -keystore testCALib calendar.apk testCA.
Android數字證書概述:
Android系統要求每個安裝進系統的應用程序都是通過數字證書籤名的,數字證書的私鑰則保存在程序開發者的手中。Android將數字證書用來標識應用程序的做者和在應用程序之間創建信任關係,兒不是用來決定最終用戶能夠安裝哪些應用程序。這個數字證書並不須要權威的數字證書籤名機構認證,它只是用來讓應用程序包自我認證的。
Android數字證書包含如下幾個要點:
(1)全部的應用程序都必須有數字證書,Android系統不會安裝一個沒有數字證書的應用程序
(2)Android程序包使用的數字證書能夠是自簽名的,不須要一個權威的數字證書機構簽名認證
(3)若是要正式發佈一個Android ,必須使用一個合適的私鑰生成的數字證書來給程序簽名,而不能使用adt插件或者ant工具生成的調試證書來發布。
(4)數字證書都是有有效期的,Android只是在應用程序安裝的時候纔會檢查證書的有效期。若是程序已經安裝在系統中,即便證書過時也不會影響程序的正常功能。
(5)Android使用標準的java工具 Keytool and Jarsigner 來生成數字證書,並給應用程序包簽名。
Android系統不會安裝運行任何一款未經數字簽名的apk程序,不管是在模擬器上仍是在實際的物理設備上。Android的開發工具(ADT插件和Ant)均可以協助開發者給apk程序簽名,它們都有兩種模式:調試模式(debug mode)和發佈模式(release mode)。
在調試模式下,android的開發工具會在每次編譯時使用調試用的數字證書給程序簽名,開發者無須關心。
當要發佈程序時,開發者就須要使用本身的數字證書給apk包簽名,能夠有兩種方法。
(1)在命令行下使用JDK中的和Keytool(用於生成數字證書)和Jarsigner(用於使用數字證書籤名)來給apk包簽名
(2)使用ADT Export Wizard進行簽名(若是沒有數字證書可能須要生成數字證書)
簽名策略:
同一個開發者的多個程序儘量使用同一個數字證書,這能夠帶來如下好處。
(1)有利於程序升級,當新版程序和舊版程序的數字證書相同時,Android系統纔會認爲這兩個程序是同一個程序的不一樣版本。若是新版程序和舊版程序的數字證書不相同,則Android系統認爲他們是不一樣的程序,併產生衝突,會要求新程序更改包名。
(2)有利於程序的模塊化設計和開發。Android系統容許擁有同一個數字簽名的程序運行在一個進程中,Android程序會將他們視爲同一個程序。因此開發者能夠將本身的程序分模塊開發,而用戶只須要在須要的時候下載適當的模塊。
(3)能夠經過權限(permission)的方式在多個程序間共享數據和代碼。Android提供了基於數字證書的權限賦予機制,應用程序能夠和其餘的程序共享概功能或者數據給那那些與本身擁有相同數字證書的程序。若是某個權限(permission)的protectionLevel是signature,則這個權限就只能授予那些跟該權限所在的包擁有同一個數字證書的程序。
另外一個須要考慮的是Android數字證書的有效期:
(1)數字證書的有效期要包含程序的預計生命週期,一旦數字證書失效,持有改數字證書的程序將不能正常升級。
(2)若是多個程序使用同一個數字證書,則該數字證書的有效期要包含全部程序的預計生命週期。
(3)Android Market強制要求全部應用程序數字證書的有效期要持續到2033年10月22日之後。
Android數字證書具體應用機制 - 51CTO.COM
http://developer.51cto.com/art/201001/180484.htm