1# Hap包签名工具 2 3* 简介 4* 目录 5* 约束 6* 编译构建 7* 说明 8 * 使用说明 9 * 接口说明 10* 相关仓 11 12#### 简介 13 14为了保证OpenHarmony应用的完整性和来源可靠,在应用构建时需要对应用进行签名。经过签名的应用才能在真机设备上安装、运行、和调试。本仓提供了签名工具的源码,包含密钥对生成、CSR文件生成、证书生成、Profile文件签名、Hap包签名等功能。 15 16 17#### 目录 18 19 developtools_hapsigner 20 21 ├── autosign # 一键签名脚本 22 ├── dist # SDK预置文件 23 ├── hapsigntool # 主代码 24 ├──hap_sign_tool # 主程序入口,完成输入参数的基础校验 25 ├──hap_sign_tool_lib # 签名工具库,解析命令字和参数列表,实现各模块逻辑功能 26 ├── tools # 自动化测试脚本 27 28 29 30#### 约束 31Hap包签名工具基于Java语言开发,需要在Java8以上Java环境运行 32(附:一键签名等脚本文件基于Python语言开发,使用需配置环境python3.x) 33#### 编译构建 34 35 1. 该工具基于Gradle 7.1编译构建,请确认环境已安装配置Gradle环境,并且版本正确 36 37 gradle -v 38 39 2. 下载代码,命令行打开文件目录至developtools_hapsigner/hapsigntool,执行命令进行编译打包 40 41 gradle build 或者 gradle jar 42 43 3. 编译后得到二进制文件,目录为: ./hap_sign_tool/build/libs/hap-sign-tool.jar 44 45**** 46#### 说明 47##### 使用说明 48 49以下说明中使用jar包为编译构建中生成的二进制文件 50 511.命令行签名 52 命令行签名分为profile文件签名和hap包签名。 53 54 (1)签名profile文件的命令实例如下: 55 56 57```shell 58java -jar hap-sign-tool.jar sign-profile -keyAlias "oh-profile1-key-v1" -signAlg "SHA256withECDSA" -mode "localSign" -profileCertFile "result\profile1.pem" -inFile "app1-profile-release.json" -keystoreFile "result\ohtest.jks" -outFile "result\app1-profile.p7b" -keyPwd "123456" -keystorePwd "123456" 59``` 60该命令的参数说明如下: 61 62 sign-profile : ProvisionProfile文件签名 63 ├── -mode #签名模式,必填项,包括localSign,remoteSign 64 ├── -keyAlias #密钥别名,必填项 65 ├── -keyPwd #密钥口令,可选项 66 ├── -profileCertFile #Profile签名证书(证书链,顺序为最终实体证书-中间CA证书-根证书),必填项 67 ├── -inFile #输入的原始Provision Profile文件,必填项 68 ├── -signAlg #签名算法,必填项,包括SHA256withECDSA / SHA384withECDSA 69 ├── -keystoreFile #密钥库文件,localSign模式时为必填项,JKS或P12格式 70 ├── -keystorePwd #密钥库口令,可选项 71 ├── -outFile #输出签名后的Provision Profile文件,p7b格式,必填项 72 73 74 75(2)签名Hap包的命令实例如下: 76 77 78```shell 79java -jar hap-sign-tool.jar sign-app -keyAlias "oh-app1-key-v1" -signAlg "SHA256withECDSA" -mode "localSign" -appCertFile "result\app1.pem" -profileFile "result\app1-profile.p7b" -inFile "app1-unsigned.zip" -keystoreFile "result\ohtest.jks" -outFile "result\app1-unsigned.hap" -keyPwd "123456" -keystorePwd "123456" 80``` 81该命令的参数说明如下: 82 83 sign-app : hap应用包签名 84 ├── -mode #签名模式,必填项,包括localSign,remoteSign 85 ├── -keyAlias #密钥别名,必填项 86 ├── -keyPwd #密钥口令,可选项 87 ├── -appCertFile #应用签名证书文件(证书链,顺序为最终实体证书-中间CA证书-根证书),必填项 88 ├── -profileFile #签名后的Provision Profile文件名,p7b格式,必填项 89 ├── -profileSigned #指示profile文件是否带有签名,1表示有签名,0表示没有签名,默认为1。可选项 90 ├── -inForm #输入的原始文件的格式,zip格式或bin格式,默认zip格式;可选项 91 ├── -inFile #输入的原始APP包文件,zip格式或bin格式,必填项 92 ├── -signAlg #签名算法,必填项,包括SHA256withECDSA / SHA384withECDSA 93 ├── -keystoreFile #密钥库文件,localSign模式时为必填项,JKS或P12格式 94 ├── -keystorePwd #密钥库口令,可选项 95 ├── -outFile #输出签名后的包文件,必填项 96 97 982.一键签名 99 100 101为降低学习成本,提高开发效率,本项目还将基于应用签名工具提供一键签名脚本,免于输入繁杂的参数命令,脚本内容包括生成密钥对、最终实体证书、签名profile包、签名hap包的命令。 102脚本以及配置文件位于目录autosign下: 103 104 - create_root.sh/create_root.bat 105 - create_appcert_sign_profile.sh/create_appcert_sign_profile.bat 106 - sign_hap.sh/sign_hap.bat 107 - createAppCertAndProfile.config 108 - createRootAndSubCert.config 109 - signHap.config 110 111使用指导: 1121. 准备依赖环境python3.5以上 1132. 准备签名工具jar包:hap-sign-tool.jar(参照上文编译生成的产物) 1143. 准备待签名的应用hap包和Provision profile模板文件 1154. 使用文本编辑器编辑createAppCertAndProfile.config,signHap.config修改配置文件中的配置信息:common.keyPwd 和 common.issuerKeyPwd 参数值改成自己定义的口令信息 1165. Linux运行create_appcert_sign_profile.sh、Windows运行create_appcert_sign_profile.bat生成签名所需文件 1176. Linux运行sign_hap.sh、Windows运行sign_hap.bat对hap包进行签名 118 119 > 说明:如需自定义生成密钥库文件,根CA,中间CA证书,profile签名证书,可执行以下步骤 120 1.使用文本编辑器编辑createRootAndSubCert.config修改配置文件中的配置信息:common.keyPwd 和 common.issuerKeyPwd 参数值改成自己定义的口令信息 121 2.Linux运行 create_root.sh、Windows运行create_root.bat生成所需密钥库文件,根CA,中间CA证书,profile签名证书 122 123 124**** 125##### 接口说明 1261.生成密钥对 127 128 generate-keypair : 生成密钥对 129 ├── -keyAlias # 密钥别名,必填项 130 ├── -keyPwd # 密钥口令,可选项 131 ├── -keyAlg # 密钥算法,必填项,包括RSA/ECC 132 ├── -keySize # 密钥长度,必填项,RSA算法的长度为2048/3072/4096,ECC算法的长度NIST-P-256/NIST-P-384 133 ├── -keystoreFile # 密钥库文件,必填项,JKS或P12格式 134 ├── -keystorePwd # 密钥库口令,可选项 135 1362.生成证书签名请求 137 138 generate-csr : 生成证书签名请求 139 ├── -keyAlias # 密钥别名,必填项 140 ├── -keyPwd # 密钥口令,可选项 141 ├── -subject # 证书主题,必填项 142 ├── -signAlg # 签名算法,必填项,包括SHA256withRSA / SHA384withRSA / SHA256withECDSA / SHA384withECDSA 143 ├── -keystoreFile # 密钥库文件,必填项,JKS或P12格式 144 ├── -keystorePwd # 密钥库口令,可选项 145 ├── -outFile # 输出文件,可选项,如果不填,则直接输出到控制台 146 1473.生成根CA/中间CA证书 148 149 generate-ca : 生成根CA/中间CA证书,如果密钥不存在,一起生成密钥 150 ├── -keyAlias # 密钥别名,必填项 151 ├── -keyPwd # 密钥口令,可选项 152 ├── -keyAlg # 密钥算法,必填项,包括RSA/ECC 153 ├── -keySize # 密钥长度,必填项,RSA算法的长度为2048/3072/4096,ECC算法的长度NIST-P-256/NIST-P-384 154 ├── -issuer # 颁发者的主题,可选项,如果不填,表示根CA 155 ├── -issuerKeyAlias # 颁发者的密钥别名,可选项,如果不填,表示根CA 156 ├── -issuerKeyPwd # 颁发者的密钥口令,可选项 157 ├── -subject # 证书主题,必填项 158 ├── -validity # 证书有效期,可选项,默认为3650天 159 ├── -signAlg # 签名算法,必填项,包括SHA256withRSA / SHA384withRSA / SHA256withECDSA / SHA384withECDSA 160 ├── -basicConstraintsPathLen # 路径长度,可选项,默认为0 161 ├── -issuerKeystoreFile # 签发者密钥库文件,可选项,JKS或P12格式 162 ├── -issuerKeystorePwd # 签发者密钥库口令,可选项 163 ├── -keystoreFile # 密钥库文件,必填项,JKS或P12格式 164 ├── -keystorePwd # 密钥库口令,可选项 165 ├── -outFile # 输出文件,可选项,如果不填,则直接输出到控制台 166 1674.生成应用调试/发布证书 168 169 generate-app-cert : 生成应用调试/发布证书 170 ├── -keyAlias # 密钥别名,必填项 171 ├── -keyPwd # 密钥口令,可选项 172 ├── -issuer # 颁发者的主题,必填项 173 ├── -issuerKeyAlias # 颁发者的密钥别名,必填项 174 ├── -issuerKeyPwd # 颁发者的密钥口令,可选项 175 ├── -subject # 证书主题,必填项 176 ├── -validity # 证书有效期,可选项,默认为3650天 177 ├── -signAlg # 签名算法,必填项,包括SHA256withECDSA / SHA384withECDSA; 178 ├── -keystoreFile # 密钥库文件,必填项,JKS或P12格式 179 ├── -keystorePwd # 密钥库口令,可选项 180 ├── -issuerKeystoreFile # 签发者密钥库文件,可选项,JKS或P12格式 181 ├── -issuerKeystorePwd # 签发者密钥库口令,可选项 182 ├── -outForm # 输出证书文件的格式,包括 cert / certChain,可选项,默认为certChain 183 ├── -rootCaCertFile # outForm为certChain时必填,根CA证书文件 184 ├── -subCaCertFile # outForm为certChain时必填,中间CA证书文件 185 ├── -outFile # 输出证书文件(证书或证书链),可选项,如果不填,则直接输出到控制台 186 1875.生成profile调试/发布证书 188 189 generate-profile-cert : 生成profile调试/发布证书 190 ├── -keyAlias # 密钥别名,必填项 191 ├── -keyPwd # 密钥口令,可选项 192 ├── -issuer # 颁发者的主题,必填项 193 ├── -issuerKeyAlias # 颁发者的密钥别名,必填项 194 ├── -issuerKeyPwd # 颁发者的密钥口令,可选项 195 ├── -subject # 证书主题,必填项 196 ├── -validity # 证书有效期,可选项,默认为3650天 197 ├── -signAlg # 签名算法,必填项,包括SHA256withECDSA / SHA384withECDSA; 198 ├── -keystoreFile # 密钥库文件,必填项,JKS或P12格式 199 ├── -keystorePwd # 密钥库口令,可选项 200 ├── -issuerKeystoreFile # 签发者密钥库文件,可选项,JKS或P12格式 201 ├── -issuerKeystorePwd # 签发者密钥库口令,可选项 202 ├── -outForm # 输出证书文件的格式,包括 cert / certChain,可选项,默认为certChain 203 ├── -rootCaCertFile # outForm为certChain时必填,根CA证书文件 204 ├── -subCaCertFile # outForm为certChain时必填,中间CA证书文件 205 ├── -outFile # 输出证书文件(证书或证书链),可选项,如果不填,则直接输出到控制台 206 2076.通用证书生成,可以生成自定义证书 208 209 generate-cert : 通用证书生成,可以生成自定义证书 210 ├── -keyAlias # 密钥别名,必填项 211 ├── -keyPwd # 密钥口令,可选项 212 ├── -issuer # 颁发者的主题,必填项 213 ├── -issuerKeyAlias # 颁发者的密钥别名,必填项 214 ├── -issuerKeyPwd # 颁发者的密钥口令,可选项 215 ├── -subject # 证书主题,必填项 216 ├── -validity # 证书有效期,可选项,默认为1095天 217 ├── -keyUsage # 密钥用法,必选项,包括digitalSignature, nonRepudiation, keyEncipherment, 218 ├ dataEncipherment, keyAgreement, certificateSignature, crlSignature, 219 ├ encipherOnly和decipherOnly,如果证书包括多个密钥用法,用逗号分隔 220 ├── -keyUsageCritical # keyUsage是否为关键项,可选项,默认为是 221 ├── -extKeyUsage # 扩展密钥用法,可选项,包括clientAuthentication,serverAuthentication, 222 ├ codeSignature,emailProtection,smartCardLogin,timestamp,ocspSignature 223 ├── -extKeyUsageCritical # extKeyUsage是否为关键项,可选项,默认为否 224 ├── -signAlg # 签名算法,必填项,包括SHA256withRSA/SHA384withRSA/SHA256withECDSA/SHA384withECDSA 225 ├── -basicConstraints # 是否包含basicConstraints,可选项,默认为否 226 ├── -basicConstraintsCritical # basicConstraints是否包含为关键项,可选项,默认为否 227 ├── -basicConstraintsCa # 是否为CA,可选项,默认为否 228 ├── -basicConstraintsPathLen # 路径长度,可选项,默认为0 229 ├── -issuerKeystoreFile # 签发者密钥库文件,可选项,JKS或P12格式 230 ├── -issuerKeystorePwd # 签发者密钥库口令,可选项 231 ├── -keystoreFile # 密钥库文件,必填项,JKS或P12格式 232 ├── -keystorePwd # 密钥库口令,可选项 233 ├── -outFile # 输出证书文件,可选项,如果不填,则直接输出到控制台 234 2357.ProvisionProfile文件签名 236 237 sign-profile : ProvisionProfile文件签名 238 ├── -mode # 签名模式,必填项,包括localSign,remoteSign 239 ├── -keyAlias # 密钥别名,必填项 240 ├── -keyPwd # 密钥口令,可选项 241 ├── -profileCertFile # Profile签名证书(证书链,顺序为最终实体证书-中间CA证书-根证书),必填项 242 ├── -inFile # 输入的原始Provision Profile文件,必填项 243 ├── -signAlg # 签名算法,必填项,包括SHA256withECDSA / SHA384withECDSA 244 ├── -keystoreFile # 密钥库文件,localSign模式时为必填项,JKS或P12格式 245 ├── -keystorePwd # 密钥库口令,可选项 246 ├── -outFile # 输出签名后的Provision Profile文件,p7b格式,必填项 247 2488.ProvisionProfile文件验签 249 250 verify-profile : ProvisionProfile文件验签 251 ├── -inFile # 已签名的Provision Profile文件,p7b格式,必填项 252 ├── -outFil # 验证结果文件(包含验证结果和profile内容),json格式,可选项;如果不填,则直接输出到控制台 253 2549.hap应用包签名 255 256 sign-app : hap应用包签名 257 ├── -mode # 签名模式,必填项,包括localSign,remoteSign,remoteResign 258 ├── -keyAlias # 密钥别名,必填项 259 ├──-keyPwd # 密钥口令,可选项 260 ├── -appCertFile # 应用签名证书文件(证书链,顺序为最终实体证书-中间CA证书-根证书),必填项 261 ├── -profileFile # 签名后的Provision Profile文件名,profileSigned为1时为p7b格式,profileSigned为0时为json格式,必填项 262 ├── -profileSigned # 指示profile文件是否带有签名,1表示有签名,0表示没有签名,默认为1。可选项 263 ├── -inForm # 输入的原始文件的格式,zip格式或bin格式,默认zip格式,可选项 264 ├── -inFile # 输入的原始APP包文件,zip格式或bin格式,必填项 265 ├── -signAlg # 签名算法,必填项,包括SHA256withECDSA / SHA384withECDSA 266 ├── -keystoreFile # 密钥库文件,localSign模式时为必填项,JKS或P12格式 267 ├── -keystorePwd # 密钥库口令,可选项 268 ├── -outFile # 输出签名后的包文件,必填项 269 27010.hap应用包文件验签 271 272 verify-app : hap应用包文件验签 273 ├── -inFile # 已签名的应用包文件,zip格式或bin格式,必填项 274 ├── -outCertchain # 签名的证书链文件,必填项 275 ├── -outProfile # 应用包中的profile文件,必填项 276 277 278 279 280#### 相关仓 281 不涉及