为了保证 OpenHarmony 应用的完整性和来源可靠,在应用构建时需要对应用进行签名。经过签名的应用才能在真机设备上安装、运行、和调试。
developtools_hapsigner 仓提供了签名工具的源码,包含密钥对生成、CSR 文件生成、证书生成、Profile 文件签名、Hap 包签名等功能。
OpenHarmony 系统中有一套默认签名信息,用于应用的开发和调试。当系统厂商正式发布系统时,需要新增或替换私有签名信息,本篇文档将介绍如何生成私有签名并在系统中进行配置。本文档需准备 Java 和 Gradle 编译环境。
文档环境如下:
开发环境:Windows 11
DevEco Studio 版本:DevEco Studio 3.1 Release(3.1.0.500)
SDK 版本:3.2.12.5(Full SDK)
开发板型号:DAYU 200
系统版本:OpenHarmony 3.2 Release
涉及仓库:Hap 包签名工具[developtools_hapsigner]
https://gitee.com/openharmony/developtools_hapsigner
基本概念
非对称密钥对:数据签名/验签的基础,应用签名工具实现了标准的非对称密钥对生成功能(支持的密钥对类型包括 ECC P384/256、RSA2048/3072/4096)
CSR:Certificate Signing Request 证书签发请求是生成证书的前提,他包括证书的公钥、证书主题和私钥签名,在申请证书之前,需要先基于密钥对生成 CSR,然后提交给 CA 签发证书。
证书:OpenHarmony 采用 RFC5280 标准构建 X509 证书信任体系。用于应用签名的 OpenHarmony 证书共有三级,分为:根 CA 证书、中间 CA 证书、最终实体证书,其中最终实体证书分为应用签名证书和 profile 签名证书。
应用签名证书表示应用开发者的身份,可保证系统上安装的应用来源可追溯,profile 签名证书实现对 profile 文件的签名进行验签,保证 profile 文件的完整性。
HAP:OpenHarmony Ability Package 是 Ability 的部署包,OpenHarmony 应用代码围绕 Ability 组件展开,它是由一个或者多个 Ability 组成。
-
Profile 文件:HarmonyAppProvision 配置文件,hap 包中的描述文件,该描述文件描述了已授权的证书权限和设备 ID 信息等信息。
-
Profile 签名场景:
-
-
应用签名场景:
-
-
如何生成私有签名
①准备签名工具
克隆 developtools_hapsigner 仓库:
git clone https://gitee.com/openharmony/developtools_hapsigner.git
命令行打开文件目录至 developtools_hapsigner/hapsigntool,执行命令进行编译打包:
gradle build 或者 gradle jar
编译后得到二进制文件,目录为:
developtools_hapsigner/hapsigntool/hap_sign_tool/build/libs/hap-sign-tool.jar
②签名工具说明
-
生成密钥对:
-
generate-keypair : ├── -keyAlias # 密钥别名,必填项 ├── -keyPwd # 密钥口令,可选项 ├── -keyAlg # 密钥算法,必填项,包括RSA/ECC ├── -keySize # 密钥长度,必填项,RSA算法的长度为2048/3072/4096,ECC算法的长度NIST-P-256/NIST-P-384 ├── -keystoreFile # 密钥库文件,必填项,JKS或P12格式 ├── -keystorePwd # 密钥库口令,可选项
-
生成证书签名请求:
-
generate-csr : ├── -keyAlias # 密钥别名,必填项 ├── -keyPwd # 密钥口令,可选项 ├── -subject # 证书主题,必填项 ├── -signAlg # 签名算法,必填项,包括SHA256withRSA / SHA384withRSA / SHA256withECDSA / SHA384withECDSA ├── -keystoreFile # 密钥库文件,必填项,JKS或P12格式 ├── -keystorePwd # 密钥库口令,可选项 ├── -outFile # 输出文件,可选项,如果不填,则直接输出到控制台
-
生成根 CA/中间 CA 证书,如果密钥不存在,一起生成密钥:
-
generate-ca : ├── -keyAlias # 密钥别名,必填项 ├── -keyPwd # 密钥口令,可选项 ├── -keyAlg # 密钥算法,必填项,包括RSA/ECC ├── -keySize # 密钥长度,必填项,RSA算法的长度为2048/3072/4096,ECC算法的长度NIST-P-256/NIST-P-384 ├── -issuer # 颁发者的主题,可选项,如果不填,表示根CA ├── -issuerKeyAlias # 颁发者的密钥别名,可选项,如果不填,表示根CA ├── -issuerKeyPwd # 颁发者的密钥口令,可选项 ├── -subject # 证书主题,必填项 ├── -validity # 证书有效期,可选项,默认为3650天 ├── -signAlg # 签名算法,必填项,包括SHA256withRSA / SHA384withRSA / SHA256withECDSA / SHA384withECDSA ├── -basicConstraintsPathLen # 路径长度,可选项,默认为0 ├── -issuerKeystoreFile # 签发者密钥库文件,可选项,JKS或P12格式 ├── -issuerKeystorePwd #&nbs