Android簽名證書的生成

2020-09-29 14:00:46

本節只針對如何從零開始實現簡單的打包簽名

概要

  • debug.keystore:使用Android Studio直接編譯執行時預設使用的簽名證書,存放路徑C:\Users<你的使用者名稱>.android
  • app-debug.apk:使用Android Studio直接編譯時生成的apk檔案,生成路徑build/outputs/apk/debug/
  • V1(Jar Signature):
  • V2(Full APK Signature):
  • APK檔案的校驗指令:jarsigner -verbose -certs -verify 簽名過的apk檔案

Keytool生成JKS簽名證書

  • cmd指令生成JKS簽名證書:keytool -genkey -v -keystore aso.jks -alias aso -keyalg RSA -validity 9125

在這裡插入圖片描述
keytool:是一個Java資料證書的管理工具,已經整合在JDK中了,keytool 將金鑰(key)和證書(certificates)存在一個keystore的檔案中,或者是jks的檔案
-genkey:執行的是生成數位憑證操作,將在使用者目錄中建立一個預設.keystore檔案或者.jks檔案
-v:顯示金鑰庫中的證書詳細資訊
-keystore aso.jks:生成的證書的檔名為"aso.jks"(自定義的證書名)
-alias aso.jks:證書的別名為"aso.jks"。(一般和上面的證書名名相同,可以不同,但要記好,簽名時會用到)
-keyalg RSA:指定生成金鑰檔案採用的演演算法為RSA(可以是RSA、DSA,預設是DSA)
-validity 9125:指定證書的有效天數(365*25),時間到期之後證書將失效
-keysize:指定金鑰長度
-storepass:指定金鑰庫的密碼(獲取keystroe資訊所需的密碼)
-keypass:指定別名條目的密碼(私鑰的密碼)
dname:證書擁有者的資訊。可以不用在命令中註明,會提示你輸入(CN=aso, OU=aso, O=aso, L=aso, ST=aso, C=aso
-export:將別名指定的證書匯出到檔案
-file:指定匯出到檔案的檔名稱
-delete:刪除金鑰庫中的某條目
-printcert:檢視匯出的資訊

  • 完整在指令中寫好資訊的cmd指令:keytool -genkey -v -keystore C:\Users\Aso\Desktop\jks\aso.jks -alias aso -keyalg RSA -validity 9125 -keypass 111111 -storepass 111111 -keysize 1024 -dname "CN=aso, OU=aso, O=aso, L=aso, ST=aso, C=aso"

在這裡插入圖片描述

  • cmd指令將JKS遷移到行業標準格式 PKCS12:keytool -importkeystore -srckeystore C:\Users\Aso\Desktop\jks\aso.jks -destkeystore C:\Users\Aso\Desktop\jks\aso.jks -deststoretype pkcs12

在這裡插入圖片描述

Android Studio生成JKS簽名證書

AS版本資訊

博主當下使用的AS版本資訊

簽名證書的生成

Android APP都需要我們用一個證書對應用進行數位簽章,不然的話是無法安裝到Android手機上的,平時我們偵錯執行到手機上時,是AS會自動使用預設的金鑰和證書來進行簽名;但是我們實際用於釋出時則需要進行主動簽名,那麼我們的簽名證書是怎麼來的?下面圖文結合會手把手教你
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

在這裡插入圖片描述
在這裡插入圖片描述
到此,前面檔案已經生成在我們指定的目錄下了
備註:一個簽名檔案,是可以被多個APP專案進行簽名打包使用的

簽名打包

  • 偵錯執行時的打包
    我們上面有提到使用AS直接編譯進行偵錯執行時,使用的是預設的簽名檔案進行簽名,這時候會在build/outputs/apk/debug/目錄下生成一個app-debug.apk,這個就是使用谷歌預設的簽名檔案進行簽名打包的
  • 釋出編譯時的打包
    當我們已經開發完成之後,要實際放到應用市場上去進行釋出時,就需要使用正式簽名檔案編譯Release包,其中可以使用AS的操作介面進行打包,也可以使用Gradle命令進行打包,以下是AS視覺化操作進行打包步驟
    在這裡插入圖片描述
    根據需要,可以簽名打包出Debug版本和Release版本
    在這裡插入圖片描述
    編譯出來的目錄地址:
    在這裡插入圖片描述
    最後,我們初次把包打出來之後,當然要驗證是否有簽名成功
    jarsigner -verbose -certs -verify 簽名過的apk檔案
    AS偵錯執行時包驗證結果如下
C:\Users\Aso>jarsigner -verbose -certs -verify C:\Users\Aso\Desktop\apk\app-debug.apk

  s = 已驗證簽名
  m = 在清單中列出條目
  k = 在金鑰庫中至少找到了一個證書
  i = 在身份作用域內至少找到了一個證書

沒有清單。

jar 未簽名。

C:\Users\Aso>

使用自定義生成的簽名證明進行簽名Release包時,結果證明不管jks是否遷移到行業標準格式 PKCS12,在對apk進行簽名校驗時均會出現如下內容(裁剪過的),原因待查! (詳細內容傳送門)

Microsoft Windows [版本 10.0.18362.1082]
(c) 2019 Microsoft Corporation。保留所有權利。

C:\Users\Aso>jarsigner -verbose -certs -verify C:\Users\Aso\Desktop\jks\release\app-release.apk

sm      2180 Fri Nov 30 00:00:00 CST 1979 AndroidManifest.xml

      >>> 簽名者
      X.509, CN=aso, OU=aso, O=aso, L=aso, ST=aso, C=aso
      [證書的有效期為20-9-28 下午11:15至45-9-22 下午11:15]
      [無效的證書鏈: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target]

sm         6 Fri Nov 30 00:00:00 CST 1979 META-INF/androidx.activity_activity.version

      >>> 簽名者
      X.509, CN=aso, OU=aso, O=aso, L=aso, ST=aso, C=aso
      [證書的有效期為20-9-28 下午11:15至45-9-22 下午11:15]
      [無效的證書鏈: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target]

	......

  s = 已驗證簽名
  m = 在清單中列出條目
  k = 在金鑰庫中至少找到了一個證書
  i = 在身份作用域內至少找到了一個證書

- 由 "CN=aso, OU=aso, O=aso, L=aso, ST=aso, C=aso" 簽名
    摘要演演算法: SHA-256
    簽名演演算法: SHA256withRSA, 1024 位金鑰

jar 已驗證。

警告:
此 jar 包含其證書鏈無效的條目。原因: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
此 jar 包含其簽名者證書為自簽名證書的條目。
此 jar 包含的簽名沒有時間戳。如果沒有時間戳, 則在其中任一簽名者證書到期 (最早為 2045-09-22) 之後, 使用者可能無法驗證此 jar。

簽名者證書將於 2045-09-22 到期。

C:\Users\Aso>