Appearance
签名与证书
HarmonyOS 应用发布需要数字签名,确保应用来源可信和完整性。
1. 证书体系架构
┌─────────────────────────────────────────────┐
│ Huawei AppGallery Connect │
│ (证书颁发机构 CA) │
├─────────────────────────────────────────────┤
│ 开发者证书 │
│ (.p12 - 私钥 + 公钥证书) │
├─────────────────────────────────────────────┤
│ 应用证书 │
│ (.cer - 公钥证书) │
├─────────────────────────────────────────────┤
│ 签名文件 │
│ (.p7b - 签名数据) │
└─────────────────────────────────────────────┘证书类型
| 证书类型 | 文件格式 | 用途 | 有效期 |
|---|---|---|---|
| 开发者证书 | .p12 | 标识开发者身份 | 1 年 |
| 应用证书 | .cer | 标识应用身份 | 永久 |
| 签名文件 | .p7b | 验证应用完整性 | 与应用一致 |
| CSR 文件 | .csr | 证书签名请求 | 一次性 |
2. 证书申请流程
步骤一:生成密钥对
bash
# 使用 DevEco Studio 自动生成(推荐)
# 或使用 OpenSSL 手动生成
openssl genrsa -out private_key.pem 2048步骤二:创建 CSR 文件
bash
# 生成证书签名请求
openssl req -new -key private_key.pem -out request.csr \
-subj "/C=CN/ST=Beijing/L=Beijing/O=Company/CN=com.example.app"步骤三:上传 CSR 到 AppGallery Connect
- 登录 AppGallery Connect
- 进入 "我的项目" → "我的应用"
- 选择应用 → "更多" → "证书管理"
- 上传
request.csr文件 - 下载生成的
.cer证书
步骤四:生成 P12 证书
bash
# 合并私钥和证书为 P12
openssl pkcs12 -export -out certificate.p12 \
-inkey private_key.pem \
-in app_certificate.cer3. 配置签名
hvigorfile.ts 配置
typescript
// entry/hvigorfile.ts
export const buildProfile = {
app: {
signingConfigs: [
{
name: 'default',
type: 'HarmonyOS',
material: {
certpath: './signature/app_certificate.cer',
storePassword: 'password',
keyAlias: 'keyAlias',
keyPassword: 'password'
}
}
],
products: [
{
name: 'default',
signingConfig: 'default',
compileSdkVersion: 12,
compatibleSdkVersion: 12
}
]
}
};build-profile.json5 配置
json5
{
"app": {
"signingConfigs": [
{
"name": "release",
"type": "HarmonyOS",
"material": {
"certpath": "./signature/app_certificate.cer",
"storePassword": "your_password",
"keyAlias": "your_alias",
"keyPassword": "your_password"
}
}
],
"products": [
{
"name": "release",
"signingConfig": "release",
"buildOption": {
"strictMode": {
"caseSensitiveCheck": true
}
}
}
]
}
}4. 多环境签名配置
开发/测试/生产分离
json5
// build-profile.json5
{
"app": {
"signingConfigs": [
{
"name": "debug",
"type": "HarmonyOS",
"material": {
"certpath": "./signature/debug.cer",
"storePassword": "debug_pass",
"keyAlias": "debug_key",
"keyPassword": "debug_pass"
}
},
{
"name": "release",
"type": "HarmonyOS",
"material": {
"certpath": "./signature/release.cer",
"storePassword": "${RELEASE_STORE_PASSWORD}",
"keyAlias": "release_key",
"keyPassword": "${RELEASE_KEY_PASSWORD}"
}
}
],
"products": [
{
"name": "debug",
"signingConfig": "debug"
},
{
"name": "release",
"signingConfig": "release"
}
]
}
}环境变量保护敏感信息
bash
# .env 文件(不要提交到 Git)
RELEASE_STORE_PASSWORD=your_secure_password
RELEASE_KEY_PASSWORD=your_secure_key_password
# CI/CD 中使用环境变量
export RELEASE_STORE_PASSWORD="secure_password"
hvigorw assembleHap --mode release5. 证书管理最佳实践
1. 证书备份
bash
# 备份证书到安全位置
cp signature/*.cer ~/secure_backup/certificates/
cp signature/*.p12 ~/secure_backup/certificates/
# 加密备份
tar -czf certs_backup.tar.gz signature/
openssl enc -aes-256-cbc -salt -in certs_backup.tar.gz -out certs_backup.enc2. 证书轮换
证书轮换流程:
1. 提前 30 天生成新证书
2. 使用新旧证书双重签名过渡
3. 更新所有 CI/CD 配置
4. 撤销旧证书3. 权限控制
证书访问权限:
- 开发证书:开发团队可访问
- 发布证书:仅发布管理员可访问
- 生产证书:仅自动化构建系统可访问6. 签名验证
命令行验证
bash
# 验证 HAP 签名
hdc shell bm check -n com.example.app
# 查看证书信息
openssl x509 -in app_certificate.cer -text -noout运行时验证
typescript
import { bundleManager } from '@kit.ArkKit';
async function verifyAppSignature(): Promise<boolean> {
let bundleInfo = await bundleManager.getBundleInfoForSelf(
bundleManager.BundleFlag.GET_BUNDLE_INFO_DEFAULT
);
// 检查签名状态
let isSigned = bundleInfo.signatureInfo?.isSigned;
return isSigned === true;
}7. 常见问题
问题 1:证书过期
症状:构建失败,提示证书过期
解决:
1. 登录 AppGallery Connect 续期证书
2. 重新下载 .cer 文件
3. 更新本地证书文件
4. 重新构建问题 2:签名不匹配
症状:安装失败,提示签名不一致
解决:
1. 检查使用的证书是否与之前版本一致
2. 清理构建缓存:hvigorw clean
3. 重新构建问题 3:密码错误
症状:构建时提示密码错误
解决:
1. 检查 build-profile.json5 中的密码配置
2. 确认 P12 文件密码正确
3. 必要时重新生成证书8. 面试高频问题
Q1: 证书的作用是什么?
答:证书用于标识应用开发者身份,确保应用来源可信;签名用于验证应用完整性,防止被篡改。
Q2: 开发和生产证书可以共用吗?
答:不建议。应该分离开发和生产证书,避免开发环境泄露生产密钥,也便于权限控制和审计。
Q3: 证书丢失怎么办?
答:
- 如果有备份,恢复备份
- 无备份则需在 AppGallery Connect 撤销旧证书
- 重新生成新证书
- 已上架应用需用新证书重新签名发布
9. 与 Android 对照
| 概念 | HarmonyOS | Android |
|---|---|---|
| 证书格式 | .cer/.p12 | .jks/.keystore |
| 签名工具 | DevEco Studio | jarsigner/apksigner |
| 证书管理 | AppGallery Connect | Keytool/Play Console |
| 调试证书 | 自动生成 | debug.keystore |
| 发布证书 | 手动申请 | 手动生成 |
面试提示:签名证书是应用发布的必要环节,需掌握证书申请流程和配置方法。