生成签名
使用 keytool 工具生成密钥库。密钥库是一个包含密钥对的安全文件,其中包括您的应用签名密钥。
签名的加密方式
- 之前大都使用的
RSA。 - 现在已经不推荐使用了,推荐使用
SHA256withRSA。
签名格式
- JKS(Java KeyStore):JKS 是 Java 专用格式。
- PKCS12:PKCS12 是国际标准格式,被大多数操作系统和开发工具支持。Android Studio推荐使用 PKCS12。
注意
更换签名格式是不会影响已发布应用的。
更换加密方式会影响已发布应用,导致无法更新。
JKS(RSA)
1 | keytool -genkey -alias xinghuo -keyalg RSA -validity 18250 -keystore xinghuo.keystore |
其中
- -alias android.keystore 别名为
alias android.keystore - -keyalg RSA 加密类型
RSA - -validity 20000 有效期天数
20000 - -keystore android.keystore 生成文件路径和名字
android.keystore
这将生成一个名为 xinghuo.keystore 的密钥库文件,并使用 RSA 算法生成一个密钥对。
注意
keytool在JDK的bin下面,找不到记得添加环境变量。
现在会报警告
使用的 MD5withRSA 签名算法被视为存在安全风险而且被禁用。
PKCS12(SHA256withRSA)(推荐)
1 | keytool -genkeypair -alias xinghuo -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -validity 18250 -storetype PKCS12 -keystore xinghuo2.p12 |
参数说明:
-sigalg SHA256withRSA:指定使用 SHA256withRSA 签名算法-keyalg RSA:密钥算法-keysize 2048:密钥长度(推荐 2048 或更高)-validity 18250:有效期约 50 年
JKS迁移至PKCS12
PKCS12(Public-Key Cryptography Standards #12)是目前行业广泛采用的密钥存储标准格式,相比传统的 JKS(Java KeyStore)格式具有更好的跨平台兼容性(支持 Java、iOS、Windows 等多平台)和安全性。
Android 开发中,推荐将签名证书迁移到 PKCS12 格式(文件后缀通常为 .p12 或 .pfx)。
迁移到行业标准格式 PKCS12
1 | keytool -importkeystore -srckeystore xinghuo.keystore -destkeystore xinghuo.p12 -deststoretype pkcs12 |
查看转换结果
1 | keytool -list -v -keystore xinghuo.p12 |
可以看到
密钥库类型: PKCS12
PKCS12 和 JKS 只是密钥存储格式的不同,转换过程中:
- 私钥、公钥、证书链等核心签名信息保持不变;
- 应用签名时使用的签名算法(如 SHA256withRSA) 也不会改变;
- 转换后的证书本质上与原证书是 “同一身份”,Android 系统和应用商店会识别为同一开发者签名。
因此,用转换后的 PKCS12 证书签名的新版本应用,与原 JKS 证书签名的旧版本应用签名一致,用户可以正常覆盖更新,不会出现 “签名不匹配” 的安装失败问题。
获取签名信息
查看签名类型、有效期、SHA1值
JKS格式
1 | keytool -list -v -keystore xinghuo.keystore -storepass xhkjedu |
PKCS12格式
1 | keytool -list -v -keystore xinghuo2.p12 -storepass xhkjedu |
项目中使用
JKS
签名配置
假如我i们的签名文件是xinghuo.keystore
把它放到app目录下的src同级目录中
build.gradle.kts中添加配置
1 | android { |
PKCS12
假如我i们的签名文件是xinghuo.p12
把它放到app目录下的src同级目录中
build.gradle.kts中添加配置
1 | android { |
定义变量
build.gradle.kts
android 节点下添加
1 | android { |
代码中获取
在添加buildConfig = true后,编译后会生成BuildConfig类。
代码中也可以获取环境
1 | private var isTest = BuildConfig.IS_TEST |
build.gradle
android节点下添加
1 | signingConfigs { |
gradle.properties 中添加属性
1 | RELEASE_KEY_PASSWORD=xxxxxx |
打包