本文同步发表于我的微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新
在鸿蒙(HarmonyOS)开发中,为不同环境(如开发、测试、生产)配置独立的签名信息是保证应用安全的关键步骤。以下是分环境管理签名配置的方案,包含自动化和手动两种方式:
一、签名文件准备
1. 生成不同环境的签名证书
# 开发环境证书
openssl genrsa -out dev.pem 2048
openssl req -new -key dev.pem -out dev.csr
openssl x509 -req -in dev.csr -signkey dev.pem -out dev.cer
# 生产环境证书(使用更安全的密钥长度)
openssl genrsa -out prod.pem 4096
...
2. 文件目录结构建议
project/
├── signing/
│ ├── dev/ # 开发环境
│ │ ├── dev.p12 # PKCS12格式证书
│ │ ├── dev.cer # 证书文件
│ │ └── devKeyStore.txt # 密钥库密码
│ └── prod/ # 生产环境
│ ├── prod.p12
│ ├── prod.cer
│ └── prodKeyStore.txt
二、手动配置方案(基于build-profile.json5
)
1. 分环境配置签名
// build-profile.json5
{
"appSigning": {
"default": {
"signature": {
"dev": { // 开发环境
"certPath": "signing/dev/dev.cer",
"keyPath": "signing/dev/dev.p12",
"keyPassword": "dev123",
"storePassword": "dev456",
"profile": "signing/dev/devProfile.p7b",
"profilePassword": "dev789"
},
"prod": { // 生产环境
"certPath": "signing/prod/prod.cer",
"keyPath": "signing/prod/prod.p12",
"keyPassword": "${PROD_KEY_PWD}", // 推荐用环境变量
"storePassword": "${PROD_STORE_PWD}",
"profile": "signing/prod/prodProfile.p7b"
}
}
}
}
}
2. 编译时指定环境
# 开发环境构建
npm run build -- --env=dev
# 生产环境构建
npm run build -- --env=prod
三、自动化配置方案(基于Gradle脚本)
1. 创建签名配置脚本
// build.gradle
android {
signingConfigs {
dev {
storeFile file('../signing/dev/dev.p12')
storePassword findProperty('devStorePwd') ?: ''
keyAlias 'devKey'
keyPassword findProperty('devKeyPwd') ?: ''
}
prod {
storeFile file('../signing/prod/prod.p12')
storePassword System.getenv("PROD_STORE_PWD")
keyAlias 'prodKey'
keyPassword System.getenv("PROD_KEY_PWD")
}
}
buildTypes {
debug {
signingConfig signingConfigs.dev
}
release {
signingConfig signingConfigs.prod
}
}
}
2. 通过环境变量注入密码
# Linux/macOS
export PROD_STORE_PWD=your_password
./gradlew assembleRelease
# Windows
set PROD_STORE_PWD=your_password
gradlew assembleRelease
四、建议
-
敏感信息保护:
- 将密码存储在
local.properties
(添加到.gitignore
):devKeyPwd=dev123 prodKeyPwd=prod456
- 或使用密钥管理服务(如华为云KMS)。
- 将密码存储在
-
环境隔离:
# 开发环境使用调试证书 npm run dev -- --signingConfig=dev # 生产构建时强制校验 if [ "$ENV" == "prod" ] && [ ! -f "signing/prod/prod.p12" ]; then echo "生产证书缺失!" exit 1 fi
-
多设备证书:
// 为不同设备类型配置签名 "targets": { "phone": { "signing": "signing/phone/..." }, "watch": { "signing": "signing/watch/..." } }
五、常见问题解决
1. 证书指纹冲突
# 查看证书SHA256指纹
keytool -list -v -keystore dev.p12 -storetype pkcs12
2. 动态切换环境(代码中判断)
import { config } from '@kit.AbilityKit';
const isProd = config.env === 'release'; // 根据构建类型判断
const apiUrl = isProd ? 'https://api.prod.com' : 'https://api.dev.com';
通过以上方案,可以实现鸿蒙应用签名的环境隔离,兼顾开发便捷性与生产安全性。