新版Android Studio Arctic Fox生成簽名報錯

軟件版本及開發環境

Android Studio Arctic Fox | 2020.3.1 Patch 4
Build #AI-203.7717.56.2031.7935034, built on November 21, 2021
Runtime version: 11.0.10+0-b96-7281165 x86_64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
macOS 11.2.3
GC: G1 Young Generation, G1 Old Generation
Memory: 2048M
Cores: 16
Registry: documentation.show.toolbar=true, external.system.auto.import.disabled=true

術語提示

密鑰庫文件和密鑰文件

密鑰庫文件和密鑰文件的關係:一個密鑰庫文件中可放多個密鑰文件

錯誤提示

Key was created with errors: 警告: PKCS12 密鑰庫不支持其他存儲和密鑰口令。正在忽略用戶指定的-keypass值。

Error: Get Key failed: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.

雖然會報出如上錯誤但是依然會生成簽名文件,但是當使用生成的簽名文件去打包的時候,Android studio build控制檯窗口會提示如下錯誤 Execution failed for task ':app:packageDevDebug'.

A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade com.android.ide.common.signing.KeytoolException: Failed to read key a2 from store "/usr/local/var/www/Android/learn/music/android-cloud-music/config/ixuea_courses.jks": No key with alias 'a2' found in keystore /usr/local/var/www/Android/learn/music/android-cloud-music/config/ixuea_courses.jks

Try: Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

簽名失敗的原因

因爲AndroidStudio創建密鑰的引導窗口是按照jks格式的創建模板提供的表單,但實際我們創建出來的文件是p12格式的(具體原因不明),而p12只有storepass屬性,沒有keypass,因此我們填入的keypass將不會生效,簽名的時候也會無法正常按照我們創建時填寫的keypass來讀取我們的密鑰

解決方案

如果只是希望有一個簽名文件,不需要密鑰庫文件和密鑰文件的密碼不一致,那就有一個很簡單的解決方案就是將密鑰庫文件的密碼和密鑰的密碼設置一致,就不會有這個錯誤了,這就相當於沒有給密鑰設置密碼

如果需要將密鑰庫文件和密鑰文件的密碼不一致,可以採用下面的方法

方案一(推薦方案)

1. 查看密鑰庫內的密鑰列表

查看密鑰庫內的有所有的密鑰(目的是確定別名名字和密鑰庫文件的格式)

格式:

keytool -list -v -keystore 密鑰庫文件 -storepass 密鑰庫密碼(這一項不加的話,下一步也會提示輸入)

例子:

keytool -list -v -keystore ixuea_courses.jks -storepass 8J7rHtXjhD9aD

2.對密鑰庫文件內的指定別名設置密碼

格式:

keytool -keystore 密鑰庫文件 -keypasswd -alias 別名 -storepass 密鑰庫密碼

例子:

keytool -keystore ixuea_courses.jks -keypasswd -alias a1 -storepass 8J7rHtXjhD9aD

以上步驟操作完之後,Android studio 生成的p12格式的簽名就可以使用了,也就是說可以用來打包app了。 下面是一些嘗試,這些嘗試也是可以解決這個問題,我已經驗證過了,只是比較麻煩,沒有上面的方法步驟簡潔

方案二

1.將p12格式的庫文件轉成jks格式的庫文件

格式:

keytool -importkeystore -srckeystore 原密鑰庫文件 -destkeystore 轉換後的的密鑰庫文件 \
-srcstoretype 原密鑰庫文件格式 -deststoretype 轉換後的密鑰庫文件格式 \
-srcstorepass 原密鑰庫文件密碼 -deststorepass 轉換後的密鑰庫文件的密碼

原密鑰庫文件和轉換後的的密鑰庫文件名字可以一致,會自動覆蓋;原密鑰庫文件密碼和轉換後的密鑰庫文件的密碼,密碼可以一致,沒有影響

例子:

keytool -importkeystore -srckeystore ixuea_courses.jks -destkeystore ixuea_courses.jks \
-srcstoretype pkcs12 -deststoretype jks \
-srcstorepass 8J7rHtXjhD9aD -deststorepass 8J7rHtXjhD9aD 

2.爲轉換後的jks庫文件中的指定別名設置密碼

格式:

keytool -keystore 密鑰庫文件 -keypasswd -alias 別名 -storepass 密鑰庫密碼

例子:

keytool -keystore ixuea_courses.jks -keypasswd -alias a1 -storepass 8J7rHtXjhD9aD

補充知識點

常用命令總結

keytool -list -v -keystore xxx.jks -storepass 【password】 //查看祕鑰庫信息

keytool -printcert -file xxxx/META-INF/CERT.RSA //查看包簽名信息

keytool -changealias -keystore xxx.jks -alias 【舊別名】 -destalias 【新別名】 //修改別名名稱 keytool -keypasswd -keystore xxx.jks -alias 【別名】 //修改別名密碼,後面會提示輸入新舊密碼 keytool -storepasswd -keystore xxx.jks //修改祕鑰庫密碼,後面會提示輸入新舊密碼

Keytool詳細用法

一. Keytool創建和導入命令

  • 創建keystore和密鑰對
keytool -genkey -alias mydomain -keyalg RSA -keystore keystore.jks -keysize 2048
  • 爲存在的keystore生成證書請求文件CSR
keytool -certreq -alias mydomain -keystore keystore.jks -file mydomain.csr
  • 導入根證書或中級證書到keystore
keytool -import -trustcacerts -alias root -file mydomain.crt -keystore keystore.jks
  • 導入SSL服務器證書到keystore
keytool -import -trustcacerts -alias mydomain -file mydomain.crt -keystore keystore.jks
  • 爲存在的keystore生成自簽名證書
keytool -genkey -keyalg RSA -alias selfsigned -keystore keystore.jks -storepass password -validity 360 -keysize 2048
二. Keytool查看命令
  • 查看單個證書
keytool -printcert -v -file mydomain.crt
  • 列出keystore存在的所有證書
keytool -list -v -keystore keystore.jks
  • 使用別名查看keystore特定條目
keytool -list -v -keystore keystore.jks -alias mydomain

三. 其他Keytool命令

  • 刪除keystore裏面指定證書
keytool -delete -alias mydomain -keystore keystore.jks
  • 更改keysore密碼
keytool -storepasswd -new new_storepass -keystore keystore.jks
  • 導出keystore裏面的指定證書
keytool -export -alias mydomain -file mydomain.crt -keystore keystore.jks
  • 列出信任的CA證書
keytool -list -v -keystore $JAVA_HOME/jre/lib/security/cacerts
  • 導入新的CA到信任證書
keytool -import -trustcacerts -file /path/to/ca/ca.pem -alias CA_ALIAS -keystore $JAVA_HOME/jre/lib/security/cacerts

Keytool介紹

Keytool 是一個Java數據證書的管理工具 ,Keytool將密鑰(key)和證書(certificates)存在一個稱爲keystore的文件中在keystore裏,包含兩種數據:密鑰實體(Key entity)-密鑰(secret key)或者是私鑰和配對公鑰(採用非對稱加密)可信任的證書實體(trusted certificate entries)-只包含公鑰.

JDK中keytool常用參數說明:
  • -genkey 在用戶主目錄
  • -genkey 在用戶主目錄中創建一個默認文件”.keystore”,還會產生一個mykey的別名,mykey中包含用戶的公鑰、私鑰和證書(在沒有指定生成位置的情況下,keystore會存在用戶系統默認目錄)
  • -alias 產生別名 每個keystore都關聯這一個獨一無二的alias,這個alias通常不區分大小寫
  • -keystore 指定密鑰庫的名稱(產生的各類信息將不在.keystore文件中)
  • -keyalg 指定密鑰的算法 (如 RSA DSA,默認值爲:DSA)
  • -validity 指定創建的證書有效期多少天(默認 90)
  • -keysize 指定密鑰長度 (默認 1024)
  • -storepass 指定密鑰庫的密碼(獲取keystore信息所需的密碼)
  • -keypass 指定別名條目的密碼(私鑰的密碼)
  • -dname 指定證書發行者信息 其中: “CN=名字與姓氏,OU=組織單位名稱,O=組織名稱,L=城市或區域名 稱,ST=州或省份名稱,C=單位的兩字母國家代碼”
  • -list 顯示密鑰庫中的證書信息 keytool -list -v -keystore 指定keystore -storepass 密碼
  • -v 顯示密鑰庫中的證書詳細信息
  • -export 將別名指定的證書導出到文件 keytool -export -alias 需要導出的別名 -keystore 指定keystore -file 指定導出的證書位置及證書名稱 -storepass 密碼
  • -file 參數指定導出到文件的文件名
  • -delete 刪除密鑰庫中某條目 keytool -delete -alias 指定需刪除的別 -keystore 指定keystore – storepass 密碼
  • -printcert 查看導出的證書信息 keytool -printcert -file g:\sso\michael.crt
  • -keypasswd 修改密鑰庫中指定條目口令 keytool -keypasswd -alias 需修改的別名 -keypass 舊密碼 -new 新密碼 -storepass keystore密碼 -keystore sage
  • -storepasswd 修改keystore口令 keytool -storepasswd -keystore g:\sso\michael.keystore(需修改口令的keystore) -storepass pwdold(原始密碼) -new pwdnew(新密碼)
  • -import 將已簽名數字證書導入密鑰庫 keytool -import -alias 指定導入條目的別名 -keystore 指定keystore -file 需導入的證書 中創建一個默認文件”.keystore”,還會產生一個mykey的別名,mykey中包含用戶的公鑰、私鑰和證書(在沒有指定生成位置的情況下,keystore會存在用戶系統默認目錄)
  • -alias 產生別名 每個keystore都關聯這一個獨一無二的alias,這個alias通常不區分大小寫
  • -keystore 指定密鑰庫的名稱(產生的各類信息將不在.keystore文件中)
  • -keyalg 指定密鑰的算法 (如 RSA DSA,默認值爲:DSA)
  • -validity 指定創建的證書有效期多少天(默認 90)
  • -keysize 指定密鑰長度 (默認 1024)
  • -storepass 指定密鑰庫的密碼(獲取keystore信息所需的密碼)
  • -keypass 指定別名條目的密碼(私鑰的密碼)
  • -dname 指定證書發行者信息 其中: “CN=名字與姓氏,OU=組織單位名稱,O=組織名稱,L=城市或區域名 稱,ST=州或省份名稱,C=單位的兩字母國家代碼”
  • -list 顯示密鑰庫中的證書信息 keytool -list -v -keystore 指定keystore -storepass 密碼
  • -v 顯示密鑰庫中的證書詳細信息
  • -export 將別名指定的證書導出到文件 keytool -export -alias 需要導出的別名 -keystore 指定keystore -file 指定導出的證書位置及證書名稱 -storepass 密碼
  • -file 參數指定導出到文件的文件名
  • -delete 刪除密鑰庫中某條目 keytool -delete -alias 指定需刪除的別 -keystore 指定keystore – storepass 密碼
  • -printcert 查看導出的證書信息 keytool -printcert -file g:\sso\michael.crt
  • -keypasswd 修改密鑰庫中指定條目口令 keytool -keypasswd -alias 需修改的別名 -keypass 舊密碼 -new 新密碼 -storepass keystore密碼 -keystore sage
  • -storepasswd 修改keystore口令 keytool -storepasswd -keystore g:\sso\michael.keystore(需修改口令的keystore) -storepass pwdold(原始密碼) -new pwdnew(新密碼)
  • -import 將已簽名數字證書導入密鑰庫 keytool -import -alias 指定導入條目的別名 -keystore 指定keystore -file 需導入的證書 要了解某個命令的參數可以使用keytool –command_name –help來獲取。例如:使用keytool –genkeypair –help可以查看genkeypair命令的參數說明

一個優秀的安卓視頻教程

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章