每個安卓APP,都要簽名證書才能安裝在手機上,測試的應用有測試的簽名證書,生產環境有生產環境的簽名證書,在開發APP之前,我們首先生成一個用於該APP的簽名證書,用於測試調試應用,像微信支付、分享、地圖,這些等等都需要用到生產環境的簽名證書。
生成 Android 簽名文件,目前有兩種一種是 eclipse 開發工具生成的后綴名 .keystore 簽名文件,一種是Android studio 開發工具生成的后綴名.jks 簽名文件,那它們有什么不同?
1、一個是 eclipse 生成的簽名,用於eclipse 開發的APP應用打包
2、一個是 Android studio 就生成的簽名,用於Android studio 開發的APP應用打包
eclipse 和 Android studio 都是用來開發安卓應用的工具,eclipse 因為各種原因被谷歌公司拋棄了, 谷歌公司推出新的 Android studio 安卓開發工具,更方便,更容易上手。
因為我們沒有使用到Android studio 開發APP或用於離線打包APP, 所以.jks 簽名比較少用。
目前我們比較常用的是 .keystore 因為很多第三方工具還是使用.keystore 來進行簽名,像騰訊或360的應用加固,都是使用.keystore ,包括我們這里介紹的 DCloud 在線打包APP,也是使用 .keystore 來進行簽名。
一、Android平台簽名證書(.keystore)生成指南
Android平台打包發布apk應用,需要使用數字證書(.keystore文件)進行簽名,用於表明開發者身份。
Android證書的生成是自助和免費的,不需要審批或付費。
可以使用JRE環境中的keytool命令生成。
以下是windows平台生成證書的方法:
1、安裝JRE環境(推薦使用JRE8環境,如已有可跳過)
可從Oracle官方下載jre安裝包:https://www.oracle.com/technetwork/java/javase/downloads/index.html
下面以安裝目錄為“C:\Program Files\Java\jre1.8.0_201”為例,實際操作時請修改為自己安裝目錄
建議將JRE安裝路徑添加到系統環境變量,已配置可跳過此章節
打開命令行(cmd),輸入以下命令:
d: set PATH=%PATH%;"C:\Program Files\Java\jre1.8.0_201\bin"
- 第一行:切換工作目錄到D:路徑
- 第二行:將jre命令添加到臨時環境變量中
我的環境變量里之前就配置過java環境,所以無需此步
2、生成簽名證書
在D盤先設個.keystore文件的存儲目錄
使用keytool -genkey命令生成證書:
keytool -genkey -alias testalias -keyalg RSA -keysize 2048 -validity 36500 -keystore test.keystore
- testalias是證書別名,可修改為自己想設置的字符,建議使用英文字母和數字
- test.keystore是證書文件名稱,可修改為自己想設置的文件名稱,也可以指定完整文件路徑
回車后會提示:
Enter keystore password: //輸入證書文件密碼,輸入完成回車
Re-enter new password: //再次輸入證書文件密碼,輸入完成回車
What is your first and last name? [Unknown]: //輸入名字和姓氏,輸入完成回車
What is the name of your organizational unit? [Unknown]: //輸入組織單位名稱,輸入完成回車
What is the name of your organization? [Unknown]: //輸入組織名稱,輸入完成回車
What is the name of your City or Locality? [Unknown]: //輸入城市或區域名稱,輸入完成回車
What is the name of your State or Province? [Unknown]: //輸入省/市/自治區名稱,輸入完成回車
What is the two-letter country code for this unit? [Unknown]: //輸入國家/地區代號(兩個字母),中國為CN,輸入完成回車
Is CN=XX, OU=XX, O=XX, L=XX, ST=XX, C=XX correct? [no]: //確認上面輸入的內容是否正確,輸入y,回車
Enter key password for <testalias> (RETURN if same as keystore password): //確認證書密碼與證書文件密碼一樣(HBuilder|HBuilderX要求這兩個密碼一致),直接回車就可以
以上命令運行完成后就會生成證書,路徑為“D:\keystore\test.keystore”。
3、查看證書信息
可以使用以下命令查看:
keytool -list -v -keystore test.keystore Enter keystore password: //輸入密碼,回車
Keystore type: PKCS12 Keystore provider: SUN Your keystore contains 1 entry Alias name: test Creation date: 2019-10-28 Entry type: PrivateKeyEntry Certificate chain length: 1 Certificate[1]: Owner: CN=Tester, OU=Test, O=Test, L=HD, ST=BJ, C=CN Issuer: CN=Tester, OU=Test, O=Test, L=HD, ST=BJ, C=CN Serial number: 7dd12840 Valid from: Fri Jul 26 20:52:56 CST 2019 until: Sun Jul 02 20:52:56 CST 2119 Certificate fingerprints: MD5: F9:F6:C8:1F:DB:AB:50:14:7D:6F:2C:4F:CE:E6:0A:A5 SHA1: BB:AC:E2:2F:97:3B:18:02:E7:D6:69:A3:7A:28:EF:D2:3F:A3:68:E7 SHA256: 24:11:7D:E7:36:12:BC:FE:AF:2A:6A:24:BD:04:4F:2E:33:E5:2D:41:96:5F:50:4D:74:17:7F:4F:E2:55:EB:26 Signature algorithm name: SHA256withRSA Subject Public Key Algorithm: 2048-bit RSA key Version: 3
其中證書指紋信息(Certificate fingerprints):
- MD5
證書的MD5指紋信息(安全碼MD5) - SHA1
證書的SHA1指紋信息(安全碼SHA1) - SHA256
證書的SHA256指紋信息(安全碼SHA245)
將MD5的指紋信息去掉冒號,就是需要填入微信開放平台的簽名
4、安卓簽名獲取工具
直接通過一個apk,獲取安裝到手機的第三方應用簽名的apk包。 詳情:https://developers.weixin.qq.com/doc/oplatform/Downloads/Android_Resource.html
5、keystore的一些操作
(1)修改 keystore 的查詢密碼
當想更改ketstote 的密碼時,可以用命令 : keytool -storepasswd -keystore 例如
keytool -storepasswd -keystore D:\key\test.keystore
會提示輸入原來的密碼,然后提示輸入新的密碼,重復輸入密碼,回車鍵就完成了。
(2)修改 keystore 的alias密鑰密碼
如果需要修改alias密鑰密碼,可以用命令:
keytool -keypasswd -keystore D:\key\test.keystore -alias testkey
-alias testkey,testkey是原來填寫的別名
首先輸入,查詢密碼,驗證通過后,要求輸入原來的alias密鑰密碼,然后輸入新密碼,回車鍵完成
(3)修改 keystore 的alias別名
當你需要修改別名時,可以用命令:
keytool -changealias -keystore d:\test\test.keystore -alias testkey -destalias newkeyname
命令中的 testkey 是原來的別名,newkeyname 是新的別名稱,需要輸入查詢密碼和 alias密鑰密碼,輸完回車鍵完成。
二、安卓簽名獲取工具獲取APP簽名遇到的問題
將上面的安卓簽名獲取工具下載到手機,安裝之后,輸入包名,獲取,報錯:NameNotFoundException: Signs is null
起初一直不知道什么原因,因為uniapp的manifest.json里的包名設置的就是對的,但是自定義打包的時候包名沒有同步修改,所以導致這個錯誤。
具體問題看下面這個博客吧:uniapp微信APP支付踩坑指南:報錯errMsg: "requestPayment:fail errors"