android 系統(tǒng)簽名

也有提到怎么單獨給一個apk簽名,這里補充一下android的簽名權(quán)限控制機制诵竭。

android的標(biāo)準(zhǔn)簽名key有:

? ? ?testkey

? ? ?media

? ? latform

? ? hared

? ? 以上的四種登疗,可以在源碼的/build/target/product/security里面看到對應(yīng)的密鑰回窘,其中shared.pk8代表私鑰冯挎,shared.x509.pem公鑰泉瞻,一定是成對出現(xiàn)的系吭。

? ? 其中testkey是作為android編譯的時候默認(rèn)的簽名key五嫂,如果系統(tǒng)中的apk的android.mk中沒有設(shè)置LOCAL_CERTIFICATE的值,就默認(rèn)使用testkey肯尺。

? ?而如果設(shè)置成:

? ?LOCAL_CERTIFICATE := platform

? ? 就代表使用platform來簽名沃缘,這樣的話這個apk就擁有了和system相同的簽名,因為系統(tǒng)級別的簽名也是使用的platform來簽名则吟,此時使用android:sharedUserId="android.uid.system"才有用孩灯!

? ? ?在/build/target/product/security目錄下有個README,里面有說怎么制作這些key以及使用問題(android4.2):

? ? ?從上面可以看出來在源碼下的/development/tools目錄下有個make_key的腳本逾滥,通過傳入兩個參數(shù)就可以生成一對簽名用的key峰档。

? ? 其中第一個為key的名字,一般都默認(rèn)成android本身有的寨昙,因為很多地方都默認(rèn)使用了這些名字讥巡,我們自定義的話只需要對第二個參數(shù)動手腳,定義如下:

? ? C ---> Country Name (2 letter code) ST ---> State or Province Name (full name) L ---> Locality Name (eg, city) O ---> Organization Name (eg, company) OU ---> Organizational Unit Name (eg, section) CN ---> Common Name (eg, your name or your server’s hostname) emailAddress ---> Contact email addre

? ? 另外在使用上面的make_key腳本生成key的過程中會提示輸入password舔哪,我的處理是不輸入欢顷,直接enter,不要密碼捉蚤!后面解釋抬驴,用自定義的key替換/security下面的。

? ? 可以看到android源碼里面的key使用的第二個參數(shù)就是上面README里面的缆巧,是公開的布持,所以要release版本的系統(tǒng)的話,肯定要有自己的簽名key才能起到一個安全控制作用陕悬。

? ? 在上面提到如果apk中的編譯選項LOCAL_CERTIFICATE沒有設(shè)置的話题暖,就會使用默認(rèn)的testkey作為簽名key,我們可以修改成自己想要的key捉超,按照上面的步驟制作一個releasekey胧卤,修改android配置在/build/core/config.mk中定義變量:

在主makefile文件里面:

ifeq?($(DEFAULT_SYSTEM_DEV_CERTIFICATE),build/target/product/security/releasekey)

? BUILD_VERSION_TAGS?+=?release-key

這樣的話默認(rèn)的所有簽名將會使用releasekey。

修改完之后就要編譯了拼岳,如果上面的這些key在制作的時候輸入了password就會出現(xiàn)如下錯誤:

我在網(wǎng)上找到了合理的解釋:

其實會出現(xiàn)這個錯誤的最根本的原因是多線程的問題枝誊。在編譯的時候為了加速一般都會執(zhí)行make -jxxx,這樣本來需要手動輸入密碼的時候惜纸,由于其它線程的運行叶撒,就會導(dǎo)致影響當(dāng)前的輸入終端绝骚,所以就會導(dǎo)致密碼無法輸入的情況!

再編譯完成之后也可以在build.prop中查看到變量:

這樣處理了之后編譯出來的都是簽名過的了痊乾,系統(tǒng)才算是release版本

我發(fā)現(xiàn)我這樣處理之后,整個系統(tǒng)的算是全部按照我的要求簽名了椭更。

網(wǎng)上看到還有另外的簽名release辦法哪审,但是應(yīng)該是針對另外的版本的,借用學(xué)習(xí)一下:

make?-j4?PRODUCT-product_modul-user?dist

這個怎么跟平時的編譯不一樣,后面多了兩個參數(shù)PRODUCT-product_modul-user 和 dist. 編譯完成之后回在源碼/out/dist/目錄內(nèi)生成個product_modul-target_files開頭的zip文件.這就是我們需要進行簽名的文件系統(tǒng).

我的product_modul 是full_gotechcn,后面加“-user”代表的是最終用戶版本虑瀑,關(guān)于這個命名以及product_modul等可參考http://blog.csdn.net/jscese/article/details/23931159

編譯出需要簽名的zip壓縮包之后湿滓,就是利用/security下面的準(zhǔn)備的key進行簽名了:

./build/tools/releasetools/sign_target_files_apks?-d?/build/target/product/security??out/dist/full_gotechcn-target_files.zip???out/dist/signed_target_files.zi

簽名目標(biāo)文件 輸出成signed_target_files.zi

如果出現(xiàn)某些apk出錯,可以通過在full_gotechcn-target_files.zip前面加參數(shù)"-e =" 來過濾這些apk.

然后再通過image的腳本生成imag的zip文件舌狗,這種方式不適用與我目前的工程源碼叽奥,沒有做過多驗證!

Android簽名機制可劃分為兩部分:(1)ROM簽名機制痛侍;(2)第三方APK簽名機制朝氓。

Android APK實際上是一個jar包,而jar包又是一個zip包主届。APK包的簽名實際上使用的是jar包的簽名機制:在zip中添加一個META的子目錄赵哲,其中存放簽名信息;而簽名方法是為zip包中的每個文件計算其HASH值君丁,得到簽名文件(*.sf)枫夺,然后對簽名文件(.sf)進行簽名并把簽名保存在簽名塊文件(*.dsa)中。

在編譯Android源碼生成ROM的過程中绘闷,會使用build/target/product/security目錄中的4個key(media, platform, shared, testkey)來對apk進行簽名橡庞。其中,*.pk8是二進制形式(DER)的私鑰印蔗,*.x509.pem是對應(yīng)的X509公鑰證書(BASE64編碼)扒最。build/target/product/security目錄中的這幾個默認(rèn)key是沒有密碼保護的,只能用于debug版本的ROM华嘹。

要生成Release版本的ROM扼倘,可先生成TargetFiles,再使用帶密碼的key對TargetFiles重新簽名除呵,最后由重簽名的TargetFiles來生成最終的ROM再菊。

可以使用Android源碼樹中自帶的工具“development/tools/make_key”來生成帶密碼的RSA公私鑰對(實際上是通過openssl來生成的): $ development/tools/make_key media ‘/C=CN/ST=Sichuan/L=Chengdu/O=MyOrg/OU=MyDepartment/CN=MyName’ 上面的命令將生成一個二進制形式(DER)的私鑰文件“media.pk8”和一個對應(yīng)的X509公鑰證書文件“media.x509.pem”。其中颜曾,/C表示“Country Code”纠拔,/ST表示“State or Province”,/L表示“City or Locality”泛豪,/O表示“Organization”稠诲,/OU表示“Organizational Unit”侦鹏,/CN表示“Name”。前面的命令生成的RSA公鑰的e值為3臀叙,可以修改development/tools/make_key腳本來使用F4 (0×10001)作為e值(openssl genrsa的-3參數(shù)改為-f4)略水。

也可以使用JDK中的keytool來生成公私鑰對,第三方APK簽名一般都是通過keytool來生成公私鑰對的劝萤。

可以使用openssl x509命令來查看公鑰證書的詳細(xì)信息: $ openssl x509 -in media.x509.pem -text -noout or, $ openssl x509 -in media.x509.pem -inform PEM -text -noout

還可以使用JDK中的keytool來查看公鑰證書內(nèi)容渊涝,但其輸出內(nèi)容沒有openssl x509全面: $ keytool -printcert -v -file media.x509.pem

有了key之后,可以使用工具“build/tools/releasetools/sign_target_files”來對TargetFiles重新簽名: $ build/tools/releasetools/sign_target_files_apks -d new_keys_dir -o target_files.zip target_files_resigned.zip 其中床嫌,new_keys_dir目錄中需要有四個key(media, platform, shared, releasekey)跨释。注意:這里的releasekey將代替默認(rèn)的testkey(請參考build/tools/releasetools/sign_target_files腳本實現(xiàn)),也就是說厌处,如果某個apk的Android.mk文件中的LOCAL_CERTIFICATE為testkey鳖谈,那么在生成TargetFiles時是使用的build/target/product/security/testkey來簽名的,這里重新簽名時將使用new_keys_dir/releasekey來簽名阔涉。

uild/tools/releasetools/sign_target_files_apks是通過host/linux-x86/framework/signapk.jar來完成簽名的缆娃。也可以直接使用host/linux-x86/framework/signapk.jar來對某個apk進行簽名: $ java -jar signapk [-w] publickey.x509[.pem] privatekey.pk8 input.jar output.jar 其中,”-w”表示還對整個apk包(zip包)進行簽名瑰排,并把簽名放在zip包的comment中龄恋。

對于第三方應(yīng)用開發(fā)者而言,對APK簽名相對要簡單得多凶伙。第三方應(yīng)用開發(fā)一般采用JDK中的keytool和jarsigner來完成簽名密鑰的管理和APK的簽名郭毕。

使用keytool來生成存儲有公私鑰對的keystore: $ keytool -genkey -v -keystore my-release-key.keystore -alias mykey -keyalg RSA -keysize 2048 -validity 10000

查看生成的密鑰信息: $ keytool -list -keystore my-release-key.keystore -alias mykey -v or, $ keytool -list -keystore my-release-key.keystore -alias mykey -rfc (注:獲取Base64格式的公鑰證書,RFC 1421)

導(dǎo)出公鑰證書: $ keytool -export -keystore mystore -alias mykey -file my.der (注:二進制格式公鑰證書函荣,DER) $ keytool -export -keystore mystore -alias mykey -file my.pem -rfc (注:Base64格式公鑰證書显押,PEM)

對APK進行簽名: $ jarsigner -verbose -keystore my-release-key.keystore my_application.apk mykey

驗證簽名: $ jarsigner -verify -verbose -certs my_application.apk

在進行Android二次開發(fā)時,有時需要把build/target/product/security下面的公私鑰對轉(zhuǎn)換為keystore的形式傻挂,可以參考這篇文章:把Android源碼中的密碼對轉(zhuǎn)換為keystore的方法乘碑。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市金拒,隨后出現(xiàn)的幾起案子兽肤,更是在濱河造成了極大的恐慌,老刑警劉巖绪抛,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件资铡,死亡現(xiàn)場離奇詭異,居然都是意外死亡幢码,警方通過查閱死者的電腦和手機笤休,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來症副,“玉大人店雅,你說我怎么就攤上這事政基。” “怎么了闹啦?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵沮明,是天一觀的道長。 經(jīng)常有香客問我窍奋,道長荐健,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任费变,我火速辦了婚禮摧扇,結(jié)果婚禮上圣贸,老公的妹妹穿的比我還像新娘挚歧。我一直安慰自己,他們只是感情好吁峻,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布滑负。 她就那樣靜靜地躺著,像睡著了一般用含。 火紅的嫁衣襯著肌膚如雪矮慕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天啄骇,我揣著相機與錄音痴鳄,去河邊找鬼。 笑死缸夹,一個胖子當(dāng)著我的面吹牛痪寻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播虽惭,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼橡类,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了芽唇?” 一聲冷哼從身側(cè)響起顾画,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎匆笤,沒想到半個月后研侣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡炮捧,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年义辕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片寓盗。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡灌砖,死狀恐怖璧函,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情基显,我是刑警寧澤蘸吓,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站撩幽,受9級特大地震影響库继,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜窜醉,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一宪萄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧榨惰,春花似錦拜英、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至藤抡,卻和暖如春侠碧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缠黍。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工弄兜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人瓷式。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓替饿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蒿往。 傳聞我的和親對象是個殘疾皇子盛垦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容