參考資料:
https://www.cnblogs.com/onelikeone/p/10920629.html
https://www.cnblogs.com/xiaoshen666/p/11008255.html
今天在外網上下載了一個apk,想安裝到我的Huawei Mate20X 上,沒想到出現了這一幕:
提示我這個apk沒有包含任何證書?什么鬼,沒有證書這個apk是怎么發布的,在網上查找了資料,發現大部分都是在扯淡完全不解決問題。經過20多分鍾的折騰,我成功地使用了重簽名的方式解決了這個問題,這篇文章將是一個半教程的形式,需要讀者有一定的開發經驗和安全協議知識。
1. 首先明確問題,這個apk的證書出現了問題
由於Android系統的安全規范,apk必須進行簽名才能夠發布,如果系統驗證后發現簽名不一致,說明這個apk被篡改了。如果系統發現完全沒有簽名,那么它會直接拒絕簽名。找到問題后我們的解決方案應該完全圍繞簽名來走。
2. 看看這個apk的簽名出現了什么問題
上Java程設課安裝過jdk,直接運行keytools命令檢查一下apk的簽名狀態。(這里我把apk重命名成了myapp.apk)
運行如下命令:
keytool -printcert -jarfile 你的apk文件
看不出毛病啊,這不是有簽名嗎?只不過簽名的信息看起來比較少。看來並不是沒有簽名,而是這個簽名華為不認啊。
3. 着手對apk進行重簽名
我們使用解壓縮軟件打開myapp.apk,里面有一個META-INF文件夾,這里面就是apk數字簽名的存放位置。我們將它刪掉,使用壓縮軟件把這里面的東西重新壓縮成.zip文件,並重命名為usigned.apk。
這樣我們就有了一個未被簽名的usigned.apk文件。
4. 正式生成RSA簽名證書
簽名就需要公私鑰了,正規發布的話可能就要用到CA了,但是我們不用這么麻煩,直接自簽發證書就好了。運行如下命令:
keytool -genkey -v -keystore myApp.keystore -alias myApp.keystore -keyalg RSA -validity 30000
它會問你幾個信息,你的名字啊,國家啊,機構啊啥啥的。直接瞎填就好了,不過要記住你的密碼。運行完獲得了一個文件myApp.keystore,如果我沒猜錯的話這個就相當於給你弄了個私鑰證書了,不過是自簽發的。
然后我們將myApp.keystore和usigned.apk放到同一個文件夾下,運行如下命令:
jarsigner -verbose -keystore myApp.keystore -signedjar sign.apk usigned.apk myApp.keystore
這段代碼就是使用jarsigner這個簽名軟件對usigned.apk進行簽名,生成簽名后的apk。依據的RSA簽名證書就是自簽發的myApp.keystore。
這樣我們就簽好名啦,放到手機上安裝一下:
安裝正常且能正常打開~~ 一切正常。
總結:因為華為嚴格的安全特性,導致有些apk簽名無法被識別,這時候我們可以用 keytools + jarsigner 進行重簽名。如果對這方面的操作不熟悉,是否可以考慮在線生成證書?如果在線生成證書不好使,是否可以考慮將其他apk的證書直接copy過去重打包?(因為經常會報錯簽名不一致,但還是讓我們安裝了)。我沒有進行嘗試,感興趣的朋友可以試一試。
補充:另外看到有網友提到一個叫MT管理器的安卓app可以更方便地管理apk簽名,讀者可以一試。