1. 程式人生 > 實用技巧 >解決華為手機無法安裝未簽名apk問題(該安裝包未包含任何證書)

解決華為手機無法安裝未簽名apk問題(該安裝包未包含任何證書)

  參考資料:

  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過去重打包?(因為經常會報錯簽名不一致,但還是讓我們安裝了)。我沒有進行嘗試,感興趣的朋友可以試一試。