Android應用數字簽名詳解
目錄
概述
Android系統要求所有的應用必須被證書進行數字簽名之後才能進行安裝。Android系統通過該證書來確認應用的作者,該證書是不需要權威機構認證的,一般情況下應用都是用開發者的自簽名證書,該證書是確保應用程式和應用程式作者之間建立信任關係,而不是用來決定使用者可以安裝哪些應用程式。
應用進行數字簽名的好處和注意事項如下:
- Android所有的應用程式必須要有數字證書籤名,Android系統不會安裝一個沒有數字證書籤名的程式。
- Android系統中,系統app使用的是平臺證書籤名,而第三方app一般使用開發者的自簽名證書。
- Release版本的第三方app(例如淘寶、支付寶、微信),必須使用一個合適私鑰生成的數字證書來給程式進行簽名,並且保證每次的迭代新版本都是使用相同的證書進行數字簽名。不然的話,新版本和舊版本的數字證書不一致,Android系統會認為這是兩個不同的app,導致更新等操作失敗。
- 數字證書是存在有效期的,這也決定了app的預計生命週期,如果數字證書超期失效,則應用無法安裝或者無法正常升級。
- Android提供了基於簽名的許可權機制,那麼一個應用程式就可以為另一個以相同證書籤名的應用程式公開自己的功能。以同一個證書對多個應用程式進行簽名,利用基於簽名的許可權檢查,你就可以在應用程式間以安全的方式共享程式碼和資料了。 不同的應用程式之間,想共享資料,或者共享程式碼,那麼要讓他們執行在同一個程序中,而且要讓他們用相同的證書籤名。
數字簽名證書生成方法
宣告:實驗生成的keystore只是作為演示使用,並沒有實際應用到專案中。大家參考時也要根據我的部落格手工修改部分引數,切忌無腦照抄!
Android是使用標準的java工具keytool和jarsigner來生成數字證書,而目前市場上第三方IDE(Android Studio和Eclipse)都是通過圖形化系統幫我們封裝了這兩個工具的具體執行步驟。
接下來,我會介紹兩種生成數字簽名證書的方式,分別通過命令列和Android Studio進行生成。
命令列工具(keytool&&jarsinger)
由於Android的數字簽名證書是用java標準工具生成的(路徑為:$JAVA_HOME/bin目錄下),那我們當然可以在命令列生成數字證書了,具體方法如下。
- 使用keytool生成數字簽名證書。示例命令如下:
keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
引數詳解:
- -keystore : 指定生成數字簽名證書的檔名和路徑。
- -alias:指定證書的別名。
- -keyalg:指定生成證書所需要的演算法。
- -keysize:指定證書大小。
- -validity:指定證書的有效期,單位為天。
示例截圖如下:
- 使用生成的keystore,利用jarsinger為應用進行簽名。示例命令如下:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name
引數詳解:
- -sigalg:簽名演算法的名稱。
- -digestalg:摘要演算法的名稱。
- -keystore : 指定簽名證書的位置。
- alias_name:簽名證書的別名。
示例截圖如下:
- google官方同時推薦使用zipalign工具對簽名的apk進行優化。該工具位於Android SDK的/build-tools/版本號/目錄下。示例命令如下:
zipalign -v 4 your_project_name-unaligned.apk your_project_name.apk
示例截圖如下:
Android Studio
使用命令列的方式可以顯得geek,並且讓我們更多的瞭解實現細節。但是,平時應用開發中更多的是注重效率,因此,我們可以採用目前google官方推薦的AS幫我們實現應用數字簽名功能。具體步驟如下。
- 選擇編譯Module->Build->Generate Signed APK->選擇編譯Module->Next。
選擇Create new,建立一個新的數字簽名證書。
填寫證書資訊。
填寫完成之後,我們點選OK,就可以生成我們的數字簽名證書了。
上述工作完成後,我們就生成了數字簽名證書,但是還沒有對我們的apk進行簽名。想要用生成的數字證書對apk進行簽名,還需要修改當前Module的build.gradle檔案,增加簽名命令,具體內容如下:
android {
compileSdkVersion 19
buildToolsVersion "19.1.0"
defaultConfig {
applicationId "××××××"
minSdkVersion 8
targetSdkVersion 19
}
signingConfigs {
debug {
// 配置debug版本的數字簽名證書
storeFile file("/home/wzy/Documents/keystore/simple-weather.jks")
storePassword "123456"
keyAlias "release-key"
keyPassword "123456"
}
release {
// 配置release版本的數字簽名證書(為了方便,這裡的release版本和debug版本共用一個數字簽名證書)
storeFile file("/home/wzy/Documents/keystore/simple-weather.jks")
storePassword "123456"
keyAlias "release-key"
keyPassword "123456"
}
}
buildTypes {
release {
// 配置release版本的數字簽名
signingConfig signingConfigs.release
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
debug {
// 配置debug版本的數字簽名
signingConfig signingConfigs.debug
}
}
lintOptions {
abortOnError false
}
}
當然,上述命令Android Studio也提供了圖形化介面進行操作,可以直接在Module Settings進行設定,截圖如下(ps:我還是喜歡手動配置)。
小結
Android應用可以在debug和release兩種模式下進行數字證書籤名。在Android Studio中,我們直接點選Run使用的是debug模式,我們在命令列敲擊bash gradle :$module_name:build
使用的是release模式。
debug模式下簽名是為了開發除錯,release模式下進行簽名則是為了正式釋出。
Android SDK提供了一個不需要密碼的證書用於在debug模式下進行簽名除錯,預設儲存在$HOME/.android/debug.keystore,但是release版本必須使用自己的數字簽名證書。
檢視應用簽名信息
首先,為什麼我們需要檢視應用簽名信息呢?
是因為,很多第三方提供的SDK服務為了區分應用必須讓我們提供數字簽名的SHA1值,例如百度地圖定位SDK、高德地圖定位SDK,為了使用這些服務,我們就必須學會如何檢視應用簽名信息。
檢視自簽名證書的資訊
我們自簽名的證書,由於keystore檔案存在於我們可訪問的路徑下,我們可以直接通過keytool命令去檢視證書資訊。
示例命令如下:
keytool -v -list -keystore my-release-key.keystore
輸入命令後,是需要輸入簽名密碼的。
引數詳解:
- -list:列出金鑰庫中的條目。
- -keystore:數字證書位置。
示例截圖如下:
檢視第三方應用或Android系統應用簽名證書資訊
其實系統應用對開發者來說也是第三方應用,但是隻要我們能拿到它的apk,就能知道它的應用簽名信息。以我目前使用的樂運動apk為例(com.oxygen.www_3.0_40.apk)。
- 用unzip命令解壓apk。
unzip com.oxygen.www_3.0_40.apk
- 進入META-INF檔案,找到其中的CERT.RSA檔案。
- 使用keytool工具進行資訊檢視,具體命令如下:
keytool -printcert -file CERT.RSA
引數詳解:
- -printcert:列印證書內容
示例截圖如下: