本節只針對如何從零開始實現簡單的打包簽名
C:\Users<你的使用者名稱>.android
build/outputs/apk/debug/
jarsigner -verbose -certs -verify 簽名過的apk檔案
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
:檢視匯出的資訊
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"
keytool -importkeystore -srckeystore C:\Users\Aso\Desktop\jks\aso.jks -destkeystore C:\Users\Aso\Desktop\jks\aso.jks -deststoretype pkcs12
Android APP都需要我們用一個證書對應用進行數位簽章,不然的話是無法安裝到Android手機上的,平時我們偵錯執行到手機上時,是AS會自動使用預設的金鑰和證書來進行簽名;但是我們實際用於釋出時則需要進行主動簽名,那麼我們的簽名證書是怎麼來的?下面圖文結合會手把手教你
到此,前面檔案已經生成在我們指定的目錄下了
備註:一個簽名檔案,是可以被多個APP專案進行簽名打包使用的
build/outputs/apk/debug/
目錄下生成一個app-debug.apk
,這個就是使用谷歌預設的簽名檔案進行簽名打包的jarsigner -verbose -certs -verify 簽名過的apk檔案
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>