生成签名
使用 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| android { signingConfigs { create("keystore") { storeFile = file("xinghuo.keystore") storePassword = "xhkjedu" keyAlias = "xinghuo" keyPassword = "xhkjedu" } }
buildTypes { val signConfig=signingConfigs.getByName("keystore") getByName("release") { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) signingConfig=signConfig } getByName("debug") { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) signingConfig=signConfig } } }
|
PKCS12
假如我i们的签名文件是xinghuo.p12
把它放到app目录下的src同级目录中
build.gradle.kts中添加配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| android { signingConfigs { create("keystore") { storeFile = file("xinghuo2.p12") storeType = "PKCS12" storePassword = "xhkjedu" keyAlias = "xinghuo" keyPassword = "xhkjedu" } }
buildTypes { val signConfig=signingConfigs.getByName("keystore") getByName("release") { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) signingConfig=signConfig } getByName("debug") { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) signingConfig=signConfig } } }
|
定义变量
build.gradle.kts
android 节点下添加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| android { signingConfigs { create("keystore") { keyAlias = "xxx" keyPassword = "xxx" storeFile = file("xinghuo.keystore") storePassword = "xxx" } }
buildTypes { val signConfig = signingConfigs.getByName("keystore") getByName("release") { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) signingConfig = signConfig buildConfigField("boolean", "IS_TEST", "false") } getByName("debug") { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) signingConfig = signConfig buildConfigField("boolean", "IS_TEST", "true") } }
buildFeatures { compose = true buildConfig = true } }
|
代码中获取
在添加buildConfig = true后,编译后会生成BuildConfig类。
代码中也可以获取环境
1
| private var isTest = BuildConfig.IS_TEST
|
build.gradle
android节点下添加
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| signingConfigs { release { keyAlias RELEASE_KEY_ALIAS keyPassword RELEASE_KEY_PASSWORD storeFile file(RELEASE_STORE_FILE) storePassword RELEASE_STORE_PASSWORD } debug { keyAlias RELEASE_KEY_ALIAS keyPassword RELEASE_KEY_PASSWORD storeFile file(RELEASE_STORE_FILE) storePassword RELEASE_STORE_PASSWORD } }
|
gradle.properties 中添加属性
1 2 3 4
| RELEASE_KEY_PASSWORD=xxxxxx RELEASE_KEY_ALIAS=xxxxxx RELEASE_STORE_PASSWORD=xxxxxx RELEASE_STORE_FILE=xxxxxx.keystore
|
打包