『壹』 APK簽名機制原理詳解
眾所周知,android系統在安裝Apk的過程中,會對Apk進行簽名校驗,校驗通過後才能安裝成功。那你知道簽名校驗的機制是什麼?具體校驗的是什麼內容嗎?申請第三方SDK(如微信支付)時填入的SAH1值是什絕頌高么?目前眾多的快速批量打包方案又是如何繞過簽名檢驗的?
我將通過一系列的文章來解開這些疑惑:
這篇文章先來介紹Apk簽名相關的基本知識。
要知道簽名是什麼,先來看為什麼需要簽名 。大家都知道,在消息通信時,必須至少解決兩個問題:一是確保消息來源的真實性,二是確保消息不會被第三方篡改。在安裝Apk時,同樣需要確保Apk來源的真實性,以及Apk沒有被第三方篡改。如何解決這兩個問題呢?方法就是開發者對Apk進行簽名:在Apk中寫入一個「指紋」。指紋寫入以後,Apk中有任何修改,都會導致這個指紋無效,Android系統在安裝Apk進行簽名校驗時就會不通過,從而保證了安全性。
要了解如何實現簽名,需要了解兩個基本概念:數字摘要和數字證書。
簡單來說,就是對一個任意長度的數據,通過一個Hash演算法計算後,都可以得到一個固定長度的二進制數據,這個數據就稱為「摘要」。摘要具有下面的幾個特徵:
前面已經說到,可以通過簽名來確保數據來源的可靠性和數據的不可篡改性。簽名就是在摘要的基礎上再進行一次加密,對摘要加密後的數據就可以當作數字簽名,在安裝Apk需要對簽名進行驗證,驗證通過才能繼續安裝。
這里有兩個過程:簽名過程 和 校驗過程。
先來說 簽名過程:
再來看 校驗過程:
這里有一個前提:接收方必須要知道發送方的公鑰和所使用的演算法。如果數字簽名和公鑰一起被篡改,接收方無法得知,還是會校驗通過。如何保證公鑰的可靠性呢?答案是數字證書,數字證書是身份認證機構(Certificate Authority)頒發的,包含了以下信息:
接收方收到消息後,先向CA驗證證書的合法性(根據證書的簽名、綁定的域名等信息。CA機構是權威的,可以保證這個過程的可靠性。)再進行簽名校驗。
需要注意的是,Apk的證書通常的自簽名的,也就是由開發者自己製作,沒有向CA機構申請。Android在安裝Apk時並沒有校驗證書本身的合法性,只是從證書中提取公鑰和加密演算法,這也正是對第三方Apk重新簽名後,還能夠繼續在沒有安裝這個Apk的系統中繼續安裝的原因。
我們在對Apk簽名時並沒有直接指定私鑰、公鑰和數字證書,而是使用keystore文件,這些信息都包含在了keystore文件中。根據編碼不同,keystore文件分為很多種,Android使用的是java標准keystore格式JKS(Java Key Storage),所以通過Android Studio導出的keystore文件是以.jks結尾的。
keystore使用的證書標準是X.509,X.509標准也有多種編碼格式,常用的有兩種:pem(Privacy Enhanced Mail)和der(Distinguished Encoding Rules)。jks使用的是der格式,Android也支持直接使用pem格式的證書進行簽名,我們下面會介紹。
兩種證書編碼格式的區別:
X.509證書格式:
Android提供了兩種對Apk的簽名方式,一種是基於JAR的簽名方式,另一種是基於Apk的簽名方式,它們的主要區別在於使用的簽名文件不一樣:jarsigner使用keystore文件進行簽名;apksigner除了並尺支持使用keystore文件進行簽名外,還支持直接指定pem證書文件和私鑰進行簽名。
不知道大家有沒有注意一個問題,我們通過櫻御keytool或者AS生成一個keystore的時候( 簽署您的應用 ),除了要輸入keystore的密碼外,還要輸入一個alias和key的密碼。在簽名時,除了要指定keystore文件和密碼外,也要指定alias和key的密碼,這是為什麼呢?
原因是keystore是一個密鑰庫,也就是說它可以存儲多對密鑰和證書,keystore的密碼是用於保護keystore本身的,一對密鑰和證書是通過alias來區分的。從這里可以看出jarsigner是支持使用多個證書對Apk進行簽名的。apksigner也同樣支持,關於apksigner的使用介紹可以參考官方文檔 apksigner 。
ok,簽名的基本概念和校驗過程就介紹到這里,關於JAR簽名和V2簽名機制的詳細介紹,參考下面兩篇文章:
『貳』 手機端抓包工具
Charles 手機抓包
介面測試之——fiddler抓包、過濾、斷點調試
AndroidHttpCapture---手機輕松抓包工具
AndroidHttpCapture使用方法:
【搭建環境】
1.在測試手機安裝AndroidHttpCapture即可。
2.如果測試手機使用移動網路,新增一個接入點,將其代理伺服器設置為127.0.0.1 埠為8888,別的參數參照已選中的接入點進行配置,保存後選擇該新增接入點即可。
如果測試手機使用WIFI,把WIFI代理設為127.0.0.1:8888。
3.首次進入AndroidHttpCapture時安裝CA證書,然後把自沖羨簽名證書添加到系統根證書目錄。
自簽名證乎陪書所在路徑:手機根目錄歲判蠢的har/littleproxy-mitm.pem。
自簽名證書添加方法:
首先用openssl命令計算證書的哈希值(可以打開Linux環境Git Bash命令窗口):
然後把上面的哈希值作為文件名,添加證書(可以打開Windows環境CMD命名窗口):
【使用方法】
https://github.com/JZ-Darkal/AndroidHttpCapture
【查看HAR文件】
http://h5.darkal.cn/har/
『叄』 如何為apk以及zip文件簽名
如果你只是想知道如何簽名及下載簽名工具,請直接看「如何使用SignApk.jar來為一個apk或zip文件簽名」部分。要創建自己的證書請從頭看起。
准備知識:
當你要發布一個軟體或是自製的ROM時,你就需要一個使用了私鑰的證書來為.apk或.zip文件進行簽名。Android系統使用證書來識別軟體作者和軟體之間所建立的認證關系。做這個事情最經典的方式就是用keytool創建證書,然後使用jarsigner進行簽名。但是本教程則會提供一個對於大多數人來說更為容易的方法,那就是使用一個名為SignApk.jar的工具。
SignApk.jar是一個已包含在Android平台源碼包中的工具,你可以在本貼的附件中下載。如果要使用SignApk.jar,你需要創建一個帶有對應證書/公鑰的私鑰。而你可以使用Openssl來創建私鑰/公鑰對。在Unix/Linux系統中使用Openssl相對來說比較容易。對於Windows用戶,你可以在本貼附件或此鏈接中下載Windows版本的Openssl。
如何使用OpenSSL創建私鑰/公鑰對(也就通常說的證書文件,有誤勿怪)(Windows版本)
下載附件中的openssl-0.9.8k_WIN32.zip
將下載到的壓縮包解壓到你電腦上的任意位置(例如:C:\OpenSSL)
在OpenSSL\bin文件夾下按順序輸入(使用CMD命令行工具,其中第2步會需要你輸入一些信息,見圖):
1、openssl genrsa -out key.pem 1024
2、openssl req -new -key key.pem -config C:\OpenSSL\openssl.cnf -out request.pem
3、openssl x509 -req -days 9999 -in request.pem -signkey key.pem -out certificate.pem
4、openssl pkcs8 -topk8 -outform DER -in key.pem -inform PEM -out key.pk8 -nocrypt
大星星提示:如果你的recovery不具備簽名校驗切換功能,那麼用你自己生成的證書文件來給ROM簽名,會提示簽名校驗失敗。因為目前幾乎所有的第三方recovery中所帶的私鑰都是testkey的。(附件中的android.zip裡面所包含的證書文件已更新為testkey)
如何使用SignApk.jar來為一個apk或zip文件簽名:
下載附件中的android.zip
將下載到的壓縮包解壓到你電腦上的任意位置(例如:C:\android)
如果你的電腦上還沒有安裝JAVA環境,請下載並進行安裝。
(如果你創建了自己的私鑰/公鑰對)復制certificate.pem和key.pk8到你解壓得到的android文件夾中
使用CMD命令行工具cd到android文件夾,然後輸入:(對於我提供的包,只需要將要簽名的文件放在android文件夾中,然後拖至對應的批處理文件上即可)
java -jar signapk.jar certificate.pem key.pk8 your-app.apk your-signed-app.apk
或是
java -jar signapk.jar certificate.pem key.pk8 your-update.zip your-signed-update.zip
『肆』 android中pem證書是怎樣生成的
證書都可以用openssl工具鏈來生成。
OpenSSL 是一個強大的安全套接字層密碼庫,囊括主要的密碼演算法、常用的密鑰和證書封裝管理功能及SSL協議,並提供豐富的應用程序供測試或其它目的使用。
在OpenSSL被曝出現嚴重安全漏洞後,發現多數通過SSL協議加密的網站使用名為OpenSSL的開源軟體包。由於這是互聯網應用最廣泛的安全傳輸方法,被網銀、在線支付、電商網站、門戶網站、電子郵件等重要網站廣泛使用,所以該漏洞影響范圍廣大。
OpenSSL漏洞不僅影響以https開頭的網站,黑客還可利用此漏洞直接對個人PC發起"心臟出血"(Heartbleed)攻擊。據分析,Windows上有大量軟體使用了存在漏洞的OpenSSL代碼庫,可能被黑客攻擊抓取用戶電腦上的內存數據。
『伍』 如何使用P12證書的Android
P12格式證書導入android的方法:
keytool無法直接導入PKCS12文件。
第一種方法是使用IE將pfx證書導入,再導出為cert格式文件。使用上面介紹的方法將其導入到密鑰倉庫中。這樣的話倉庫裡面只包含了證書信息,沒有私鑰內容。
第二種方法是將pfx文件導入到IE瀏覽器中,再導出為pfx文件。
新生成的pfx不能被導入到keystore中,報錯:keytool錯誤: java.lang.Exception: 所輸入的不是一個 X.509 認證。新生成的pfx文件可以被當作keystore使用。但會報個錯誤as unknown attr1.3.6.1.4.1.311.17.1,查了下資料,說IE導出的就會這樣,使用Netscape就不會有這個錯誤.
第三種方法是將pfx文件當作一個keystore使用。但是通過微軟的證書管理控制台生成的pfx文件不能直接使用。keytool不認此格式,報keytool錯誤: java.io.IOException: failed to decrypt safe contents entry。需要通過OpenSSL轉換一下:
1)openssl pkcs12 -in mycerts.pfx -out mycerts.pem
2)openssl pkcs12 -export -in mycerts.pem -out mykeystore.p12
通過keytool的-list命令可檢查下密鑰倉庫中的內容:
keytool -rfc -list -keystore mykeystore.p12 -storetype pkcs12
這里需要指明倉庫類型為pkcs12,因為預設的類型為jks。這樣此密鑰倉庫就即包含證書信息也包含私鑰信息。
『陸』 安卓7.0以上手機寫入系統證書
記錄一場手動寫入系統證書
谷歌在安卓7.0修改了安全策略,用戶添加的CA證書不能再用於安全連接,對於https傳輸的數據就抓取不到了,會顯示<unknown>。
我的解決方法是將charles的CA證書安裝進系統信任的證書目錄下,這樣在開啟charles代理的時候,系統就會認為CA證書安全,從而可以獲取https數據。
用 「openssl x509 -inform PEM -subject_hash_old -in charles-ssl-proxying-certificate.pem」計算出hash值,並將後綴設為0
生成hash後,替換對應名稱重新生成文件
//cer格式
openssl x509 -inform DER -text -in xxx.cer > 0dd2455e.0
//pem格式
openssl x509 -inform PEM -text -in xxx.pem > 0dd2455e.0
然後通過設置charles代理就可以查看到https的數據了。
『柒』 mitmproxy-ca-cert.pem手機證書文件安裝(一直安裝不上,折磨我了兩天!)
在mitmproxy軟體證書配置中,其中手機的證書安裝過程一般為:
「將mitmproxy-ca-cert.pem」文件發送到手機上,點擊證書文件,便會出現一個安裝窗口。」
但是,我的Android手機並不識別pem文件,如華為榮耀10 ,華談掘為Nova青春版。
解決方法為:
(打開手機「設置」;選擇「含臘核安全和隱私」;點擊「更多安全設置」,找到「從SD卡安裝」;搜索該證書文件,點擊安裝.)
1 設置
2 安全與隱私
3 更多安全設置
4 從存儲局返設備安裝
5 選中證書文件,點擊安裝
6 輸入鎖屏密碼
7 給安裝文件命名mitmproxy
8 結束了,完成安裝!!!