Skip to content

签名与证书

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

  1. 登录 AppGallery Connect
  2. 进入 "我的项目" → "我的应用"
  3. 选择应用 → "更多" → "证书管理"
  4. 上传 request.csr 文件
  5. 下载生成的 .cer 证书

步骤四:生成 P12 证书

bash
# 合并私钥和证书为 P12
openssl pkcs12 -export -out certificate.p12 \
  -inkey private_key.pem \
  -in app_certificate.cer

3. 配置签名

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 release

5. 证书管理最佳实践

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.enc

2. 证书轮换

证书轮换流程:
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: 证书丢失怎么办?

  1. 如果有备份,恢复备份
  2. 无备份则需在 AppGallery Connect 撤销旧证书
  3. 重新生成新证书
  4. 已上架应用需用新证书重新签名发布

9. 与 Android 对照

概念HarmonyOSAndroid
证书格式.cer/.p12.jks/.keystore
签名工具DevEco Studiojarsigner/apksigner
证书管理AppGallery ConnectKeytool/Play Console
调试证书自动生成debug.keystore
发布证书手动申请手动生成

面试提示:签名证书是应用发布的必要环节,需掌握证书申请流程和配置方法。