软件版本及开发环境
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命令的参数说明