1# 应用包签名工具指导 2 3## 编译构建 4 5**Java流程**: 6 71. 该工具基于Maven3编译构建,请确认环境已安装配置Maven3环境,并且版本正确 8 9 mvn -version 10 112. 下载代码,命令行打开文件目录至developtools_hapsigner/hapsigntool,执行命令进行编译打包 12 13 mvn package 14 153. 编译后得到二进制文件,目录为: ./hap_sign_tool/target 16 17**C++流程**: 18 191. 编译ohos-sdk形态的签名工具 20 21 编译release版本:默认是release版本,直接编译即可。 22 23 编译debug版本:在 hapsigntool_cpp/BUILD.gn 中 添加 defines = [ "SIGNATURE_LOG_DEBUG" ] 即可。 24 25 编译命令:./build.sh --product-name ohos-sdk 26 272. 编译产物最终路径:out/sdk/packages/ohos-sdk/ohos/toolchains-ohos-x64-xxx.zip 28 29 解压压缩包后,在lib目录下获取最终二进制产物hap-sign-tool 30 31## 开发指导 32 33### 场景介绍 34 35OpenHarmony系统内置密钥库文件,文件名称为OpenHarmony.p12,内含根CA证书、中间CA证书、最终实体证书等信息,工具基于该密钥库文件对OpenHarmony应用进行签名。 36 37按照有无应用签名证书可分为以下两种场景: 38 391. 无应用签名证书场景: 40 开发者使用该工具对应用包签名时,需按照签名步骤从第一步生成应用签名证书密钥对依次完成应用签名证书生成、profile文件签名、应用签名流程。 412. 有应用签名证书场景: 42 开发者可直接从签名步骤第三步对profile文件进行签名开始开发,使用应用签名证书和包含对应密钥的本地密钥库文件对应用进行签名。 43 44### 命令说明 45 461. 输出命令帮助信息。 47 48 ``` 49 -help # 输出命令帮助信息(不输入参数默认输出命令帮助信息) 50 ``` 51 522. 输出版本信息。 53 54 ``` 55 -version # 输出版本信息 56 ``` 57 583. 生成密钥对。 59 60 ``` 61 generate-keypair : 生成密钥对 62 ├── -keyAlias # 密钥别名,必填项 63 ├── -keyPwd # 密钥口令,可选项 64 ├── -keyAlg # 密钥算法,必填项,包括RSA/ECC 65 ├── -keySize # 密钥长度,必填项,RSA算法的长度为2048/3072/4096,ECC算法的长度NIST-P-256/NIST-P-384 66 ├── -keystoreFile # 密钥库文件,必填项 67 ├── -keystorePwd # 密钥库口令,可选项 68 ``` 69 704. 生成证书签名请求。 71 ``` 72 generate-csr : 生成证书签名请求 73 ├── -keyAlias # 密钥别名,必填项 74 ├── -keyPwd # 密钥口令,可选项 75 ├── -subject # 证书主题,必填项 76 ├── -signAlg # 签名算法,必填项,包括SHA256withRSA / SHA384withRSA / SHA256withECDSA / SHA384withECDSA 77 ├── -keystoreFile # 密钥库文件,必填项 78 ├── -keystorePwd # 密钥库口令,可选项 79 ├── -outFile # 输出文件,可选项,如果不填,则直接输出到控制台 80 ``` 81 825. 生成根CA/中间CA证书。 83 84 ``` 85 generate-ca : 生成根CA/中间CA证书,如果密钥不存在,一起生成密钥 86 ├── -keyAlias # 密钥别名,必填项 87 ├── -keyPwd # 密钥口令,可选项 88 ├── -keyAlg # 密钥算法,必填项,包括RSA/ECC 89 ├── -keySize # 密钥长度,必填项,RSA算法的长度为2048/3072/4096,ECC算法的长度NIST-P-256/NIST-P-384 90 ├── -issuer # 颁发者的主题,可选项,如果不填,表示根CA 91 ├── -issuerKeyAlias # 颁发者的密钥别名,可选项,如果不填,表示根CA 92 ├── -issuerKeyPwd # 颁发者的密钥口令,可选项 93 ├── -subject # 证书主题,必填项 94 ├── -validity # 证书有效期,可选项,默认为3650天 95 ├── -signAlg # 签名算法,必填项,包括SHA256withRSA / SHA384withRSA / SHA256withECDSA / SHA384withECDSA 96 ├── -basicConstraintsPathLen # 路径长度,可选项,默认为0 97 ├── -keystoreFile # 密钥库文件,必填项 98 ├── -keystorePwd # 密钥库口令,可选项 99 ├── -issuerKeystoreFile # 签发者密钥库文件,可选项 100 ├── -issuerKeystorePwd # 签发者密钥库口令,可选项 101 ├── -outFile # 输出文件,可选项,如果不填,则直接输出到控制台 102 ``` 103 1046. 生成应用调试/发布证书。 105 106 ``` 107 generate-app-cert : 生成应用调试/发布证书 108 ├── -keyAlias # 密钥别名,必填项 109 ├── -keyPwd # 密钥口令,可选项 110 ├── -issuer # 颁发者的主题,必填项 111 ├── -issuerKeyAlias # 颁发者的密钥别名,必填项 112 ├── -issuerKeyPwd # 颁发者的密钥口令,可选项 113 ├── -subject # 证书主题,必填项 114 ├── -validity # 证书有效期,可选项,默认为3650天 115 ├── -signAlg # 签名算法,必填项,包括SHA256withECDSA / SHA384withECDSA; 116 ├── -issuerKeystoreFile # 签发者密钥库文件,可选项,JKS或P12格式 117 ├── -issuerKeystorePwd # 签发者密钥库口令,可选项 118 ├── -keystoreFile # 密钥库文件,必填项 119 ├── -keystorePwd # 密钥库口令,可选项 120 ├── -outForm # 输出证书文件的格式,包括 cert / certChain,可选项,默认为certChain 121 ├── -rootCaCertFile # outForm为certChain时必填,根CA证书文件 122 ├── -subCaCertFile # outForm为certChain时必填,中间CA证书文件 123 ├── -outFile # 输出证书文件(证书或证书链),可选项,如果不填,则直接输出到控制台 124 ``` 125 1267. 生成profile调试/发布证书。 127 128 ``` 129 generate-profile-cert : 生成profile调试/发布证书 130 ├── -keyAlias # 密钥别名,必填项 131 ├── -keyPwd # 密钥口令,可选项 132 ├── -issuer # 颁发者的主题,必填项 133 ├── -issuerKeyAlias # 颁发者的密钥别名,必填项 134 ├── -issuerKeyPwd # 颁发者的密钥口令,可选项 135 ├── -subject # 证书主题,必填项 136 ├── -validity # 证书有效期,可选项,默认为3650天 137 ├── -signAlg # 签名算法,必填项,包括SHA256withECDSA / SHA384withECDSA; 138 ├── -issuerKeystoreFile # 签发者密钥库文件,可选项,JKS或P12格式 139 ├── -issuerKeystorePwd # 签发者密钥库口令,可选项 140 ├── -keystoreFile # 密钥库文件,必填项 141 ├── -keystorePwd # 密钥库口令,可选项 142 ├── -outForm # 输出证书文件的格式,包括 cert / certChain,可选项,默认为certChain 143 ├── -rootCaCertFile # outForm为certChain时必填,根CA证书文件 144 ├── -subCaCertFile # outForm为certChain时必填,中间CA证书文件 145 ├── -outFile # 输出证书文件(证书或证书链),可选项,如果不填,则直接输出到控制台 146 ``` 147 1488. 通用证书生成,可以生成自定义证书。 149 150 ``` 151 generate-cert : 通用证书生成,可以生成自定义证书 152 ├── -keyAlias # 密钥别名,必填项 153 ├── -keyPwd # 密钥口令,可选项 154 ├── -issuer # 颁发者的主题,必填项 155 ├── -issuerKeyAlias # 颁发者的密钥别名,必填项 156 ├── -issuerKeyPwd # 颁发者的密钥口令,可选项 157 ├── -subject # 证书主题,必填项 158 ├── -validity # 证书有效期,可选项,默认为1095天 159 ├── -keyUsage # 密钥用法,必选项,包括digitalSignature, nonRepudiation, keyEncipherment, 160 ├ dataEncipherment, keyAgreement, certificateSignature, crlSignature, 161 ├ encipherOnly和decipherOnly,如果证书包括多个密钥用法,用逗号分隔 162 ├── -keyUsageCritical # keyUsage是否为关键项,可选项,默认为是 163 ├── -extKeyUsage # 扩展密钥用法,可选项,包括clientAuthentication,serverAuthentication, 164 ├ codeSignature,emailProtection,smartCardLogin,timestamp,ocspSignature 165 ├── -extKeyUsageCritical # extKeyUsage是否为关键项,可选项,默认为否 166 ├── -signAlg # 签名算法,必填项,包括SHA256withRSA/SHA384withRSA/SHA256withECDSA/SHA384withECDSA 167 ├── -basicConstraints # 是否包含basicConstraints,可选项,默认为否 168 ├── -basicConstraintsCritical # basicConstraints是否包含为关键项,可选项,默认为否 169 ├── -basicConstraintsCa # 是否为CA,可选项,默认为否 170 ├── -basicConstraintsPathLen # 路径长度,可选项,默认为0 171 ├── -issuerKeystoreFile # 签发者密钥库文件,可选项 172 ├── -issuerKeystorePwd # 签发者密钥库口令,可选项 173 ├── -keystoreFile # 密钥库文件,必填项 174 ├── -keystorePwd # 密钥库口令,可选项 175 ├── -outFile # 输出证书文件,可选项,如果不填,则直接输出到控制台 176 ``` 177 1789. profile文件签名。 179 180 ``` 181 sign-profile : profile文件签名 182 ├── -mode # 签名模式,必填项,包括localSign,remoteSign 183 ├── -keyAlias # 密钥别名,必填项 184 ├── -keyPwd # 密钥口令,可选项 185 ├── -profileCertFile # Profile签名证书(证书链,顺序为最终实体证书-中间CA证书-根证书),必填项 186 ├── -inFile # 输入原始的模板Profile文件,文件为json格式,所在目录为developtools_hapsigner/autosign/UnsgnedReleasedProfileTemplate.json,必填项 187 ├── -signAlg # 签名算法,必填项,包括SHA256withECDSA / SHA384withECDSA 188 ├── -keystoreFile # 密钥库文件,localSign模式时为必填项 189 ├── -keystorePwd # 密钥库口令,可选项 190 ├── -outFile # 输出签名后的profile文件,p7b格式,必填项 191 ``` 192 19310. profile文件验签。 194 195 ``` 196 verify-profile : profile文件验签 197 ├── -inFile # 已签名的profile文件,p7b格式,必填项 198 ├── -outFil # 验证结果文件(包含验证结果和profile内容),json格式,可选项;如果不填,则直接输出到控制台 199 ``` 200 20111. 应用包和调试工具签名。 202 203 ``` 204 sign-app : 应用包和二进制工具签名 205 ├── -mode # 签名模式,必填项,包括localSign,remoteSign,remoteResign 206 ├── -keyAlias # 密钥别名,必填项 207 ├── -keyPwd # 密钥口令,可选项 208 ├── -appCertFile # 应用签名证书文件(证书链,顺序为实体证书-中间CA证书-根证书),必填项 209 ├── -profileFile # 签名后的Provision Profile文件名,profileSigned为1时为p7b格式,profileSigned为0时为json格式,应用包签名必填项,二进制工具签名选填 210 ├── -profileSigned # 指示profile文件是否带有签名,1表示有签名,0表示没有签名,默认为1。可选项 211 ├── -inForm # 输入的原始文件的格式,枚举值:zip、elf或bin;zip应用包对应zip,二进制工具对应elf,bin应用包为bin,默认zip;可选项 212 ├── -inFile # 输入的原始文件,应用包、elf或bin文件,必填项 213 ├── -signAlg # 签名算法,必填项,包括SHA256withECDSA / SHA384withECDSA 214 ├── -keystoreFile # 密钥库文件,localSign模式时为必填项 215 ├── -keystorePwd # 密钥库口令,可选项 216 ├── -outFile # 输出签名后的包文件,必填项 217 ├── -signCode # 是否启用代码签名,1表示开启代码签名,0表示关闭代码签名。可选项。默认对hap、hsp、hqf、elf开启代码签名,通过参数配置为0关闭。 218 219 ``` 220 22112. 应用包和调试工具文件验签。 222 223 ``` 224 verify-app : 应用包和二进制工具文件验签 225 ├── -inFile # 已签名的文件,应用包、elf或bin文件,必填项 226 ├── -outCertChain # 签名的证书链文件,必填项 227 ├── -outProfile # 应用包中的profile文件,必填项 228 ├── -inForm # 输入的原始文件的格式,枚举值:zip、elf或bin;zip应用包对应zip,二进制工具对应elf,bin应用包为bin,默认zip;可选项 229 ``` 230 231### 签名步骤 232对应用包签名的完整步骤为: 233 234- 生成应用签名证书密钥对 235- 生成应用签名证书 236- 对profile文件进行签名 237- 对应用包进行签名 238 239 240> **注意事项:** <br/> 241> 242> 1. 步骤一中的密钥对算法推荐使用ECC,出于安全性考虑,应用签名暂不使用RSA算法。 243> 2. 建议将待签名应用包、profile文件、密钥库文件OpenHarmony.p12、根CA证书、中间CA证书、签名工具放在同一个目录下,方便操作。在[**developtools_hapsigner/autosign/result**](https://gitee.com/openharmony/developtools_hapsigner/tree/master/autosign/result)路径下,有如下文件:<br/>- OpenHarmony密钥库文件**OpenHarmony.p12**<br/>- 根CA证书**rootCA.cer**<br/>- 中间CA证书**subCA.cer**<br/>- profile签名证书**OpenHarmonyProfileRelease.pem** 244 2451. **生成应用签名证书密钥对** 246 247 调用密钥对生成接口,生成签名密钥并保存到密钥库。 248 249 Java版本命令实例: 250 251 ```shell 252 java -jar hap-sign-tool.jar generate-keypair -keyAlias "oh-app1-key-v1" -keyAlg "ECC" -keySize "NIST-P-256" -keystoreFile "OpenHarmony.p12" -keyPwd "123456" -keystorePwd "123456" 253 ``` 254 255 C++版本命令实例: 256 257 ```shell 258 hap-sign-tool generate-keypair -keyAlias "oh-app1-key-v1" -keyAlg "ECC" -keySize "NIST-P-256" -keystoreFile "OpenHarmony.p12" -keyPwd "123456" -keystorePwd "123456" 259 ``` 260 261 > **说明:** 262 > 263 > 请记录下**keyAlias、keyStorePwd**和**keyPwd**的值,在后续生成应用签名证书和对应用包进行签名操作会使用到。 264 265 该命令的参数说明: 266 267 ``` 268 generate-keypair : 生成应用签名证书密钥对 269 ├── -keyAlias #用于生成应用签名证书的密钥别名,存于OpenHarmony.p12密钥库文件中,该参数必填 270 ├── -keyAlg #密钥算法,推荐使用ECC,该参数必填 271 ├── -keySize #密钥长度,ECC算法的长度NIST-P-256/NIST-P-384,该参数必填 272 ├── -keyStoreFile #密钥库文件,推荐使用提供的OpenHarmony.p12密钥库文件,该参数必填。java版本支持PKCS#12和JKS两种密钥库格式,C++版本仅支持PKCS#12密钥库格式 273 ├── -keyStorePwd #密钥库口令,OpenHarmony.p12口令默认为“123456”,必填项 274 ├── -keyPwd #密钥口令,可选项,该参数不填默认生成的密钥对无口令 275 ``` 276 2772. **生成应用签名证书** 278 279 调用应用签名证书生成接口,使用本地中间CA证书签发应用签名证书。 280 281 Java版本命令实例: 282 283 ```shell 284 java -jar hap-sign-tool.jar generate-app-cert -keyAlias "oh-app1-key-v1" -signAlg "SHA256withECDSA" -issuer "C=CN,O=OpenHarmony,OU=OpenHarmony Team,CN= OpenHarmony Application CA" -issuerKeyAlias "openharmony application ca" -subject "C=CN,O=OpenHarmony,OU=OpenHarmony Team,CN=OpenHarmony Application Release" -keystoreFile "OpenHarmony.p12" -subCaCertFile "subCA.cer" -rootCaCertFile "rootCA.cer" -outForm "certChain" -outFile "app1.pem" -keyPwd "123456" -keystorePwd "123456" -issuerKeyPwd "123456" -validity "365" 285 ``` 286 287 C++版本命令实例: 288 289 ```shell 290 hap-sign-tool generate-app-cert -keyAlias "oh-app1-key-v1" -signAlg "SHA256withECDSA" -issuer "C=CN,O=OpenHarmony,OU=OpenHarmony Team,CN= OpenHarmony Application CA" -issuerKeyAlias "openharmony application ca" -subject "C=CN,O=OpenHarmony,OU=OpenHarmony Team,CN=OpenHarmony Application Release" -keystoreFile "OpenHarmony.p12" -subCaCertFile "subCA.cer" -rootCaCertFile "rootCA.cer" -outForm "certChain" -outFile "app1.pem" -keyPwd "123456" -keystorePwd "123456" -issuerKeyPwd "123456" -validity "365" 291 ``` 292 293 该命令的参数说明: 294 295 ``` 296 generate-app-cert:生成应用签名证书 297 ├── -keyAlias # 用于生成应用签名证书的密钥别名,请与第一步生成密钥对的密钥别名-keyAlias保持一致 298 ├── -signAlg # 签名算法,必填项,包括 SHA256withECDSA / SHA384withECDSA 299 ├── -issuer # 颁发者主题,填写已提供的中间CA证书主题,该参数必填且不能修改 300 ├── -issuerKeyAlias # 颁发者密钥别名,填写中间CA证书密钥别名,该参数必填且不能修改 301 ├── -subject # 证书主题,请参照命令实例中内容保证顺序不变,该参数必填 302 ├── -issuerKeyPwd # 颁发者密钥口令,填写中间CA证书密钥口令,该参数必填,指定“123456”,不可修改 303 ├── -keystoreFile # 密钥库文件,指定使用提供的OpenHarmony.p12密钥库文件,该参数必填且不可修改。java版本支持PKCS#12和JKS两种密钥库格式,C++版本仅支持PKCS#12密钥库格式 304 ├── -rootCaCertFile # 根CA证书文件,指定为已提供的根CA证书,该参数必填且不可修改 305 ├── -subCaCertFile # 中间CA证书文件,指定为已提供的中间CA证书,该参数必填且不可修改 306 ├── -outForm # 输出证书文件格式,推荐使用certChain 307 ├── -outFile # 可选项,建议填写,不填则默认输出到控制台 308 ├── -keyPwd # 密钥口令,可选项,为第一步生成的密钥对口令 309 ├── -keystorePwd # 密钥库口令,默认为“123456” 310 ├── -validity # 证书有效期,可选项,默认为3650天 311 ``` 312 3133. **对profile文件进行签名** 314 315 调用profile文件签名接口,使用Profile签名密钥对profile文件进行签名。 316 317 Java版本命令实例: 318 319 ```shell 320 java -jar hap-sign-tool.jar sign-profile -keyAlias "openharmony application profile release" -signAlg "SHA256withECDSA" -mode "localSign" -profileCertFile "OpenHarmonyProfileRelease.pem" -inFile "UnsgnedReleasedProfileTemplate.json" -keystoreFile "OpenHarmony.p12" -outFile "app1-profile.p7b" -keyPwd "123456" -keystorePwd "123456" 321 ``` 322 323 C++版本命令实例: 324 325 ```shell 326 hap-sign-tool sign-profile -keyAlias "openharmony application profile release" -signAlg "SHA256withECDSA" -mode "localSign" -profileCertFile "OpenHarmonyProfileRelease.pem" -inFile "UnsgnedReleasedProfileTemplate.json" -keystoreFile "OpenHarmony.p12" -outFile "app1-profile.p7b" -keyPwd "123456" -keystorePwd "123456" 327 ``` 328 329 该命令的参数说明: 330 331 ``` 332 sign-profile:签名profile文件 333 ├── -keyAlias # 生成profile证书的密钥别名,该参数必填且不能修改 334 ├── -signAlg # 签名算法,包括 SHA256withECDSA / SHA384withECDSA,该参数必填 335 ├── -mode # 签名模式,目前仅支持localSign,该参数必填 336 ├── -profileCertFile # Profile签名证书,指定已提供的profile证书文件,该参数必填且不可修改 337 ├── -inFile # 输入原始的模板Profile文件,文件为json格式,所在目录为developtools_hapsigner/autosign/UnsgnedReleasedProfileTemplate.json,该参数必填 338 ├── -keystoreFile # 密钥库文件,指定使用提供的OpenHarmony.p12密钥库文件,该参数必填且不可修改。java版本支持PKCS#12和JKS两种密钥库格式,C++版本仅支持PKCS#12密钥库格式 339 ├── -outFile # 输出签名后的profile文件,p7b格式,该参数必填 340 ├── -keyPwd # 密钥口令,OpenHarmony.p12中的口令默认“123456” 341 ├── -keystorePwd # 密钥库口令,OpenHarmony.p12口令默认为“123456” 342 ``` 343 3444. **对应用包进行签名** 345 346 调用应用包签名接口,使用应用签名密钥为应用包签名。 347 348 Java版本命令实例: 349 350 ```shell 351 java -jar hap-sign-tool.jar sign-app -keyAlias "oh-app1-key-v1" -signAlg "SHA256withECDSA" -mode "localSign" -appCertFile "app1.pem" -profileFile "app1-profile.p7b" -inFile "app1-unsigned.zip" -keystoreFile "OpenHarmony.p12" -outFile "app1-signed.hap" -keyPwd "123456" -keystorePwd "123456" 352 ``` 353 354 C++版本命令实例: 355 356 ```shell 357 hap-sign-tool sign-app -keyAlias "oh-app1-key-v1" -signAlg "SHA256withECDSA" -mode "localSign" -appCertFile "app1.pem" -profileFile "app1-profile.p7b" -inFile "app1-unsigned.zip" -keystoreFile "OpenHarmony.p12" -outFile "app1-signed.hap" -keyPwd "123456" -keystorePwd "123456" 358 ``` 359 360 > **说明**: 361 > 362 > 以下参数说明默认为无应用签名证书场景,当开发场景为有应用签名证书场景时,下列参数需要修改: 363 > -keyAlias:密钥别名,填写已有应用签名证书对应的密钥别名,参数必填。 364 > -appCertFile:应用签名证书,填写已有的应用签名证书,参数必填。 365 > -keystoreFile:密钥库文件,填写已有应用签名证书对应的密钥库文件,参数必填。 366 > -keyPwd:密钥口令,填写密钥库文件中对应密钥的口令。 367 > -keystorePwd:密钥库口令,填写密钥库文件的密钥口令。 368 369 该命令的参数说明: 370 371 ``` 372 sign-app:签名应用包 373 ├── -keyAlias # 密钥别名,为第一步生成的密钥信息别名,该参数必填 374 ├── -signAlg # 签名算法,包括 SHA256withECDSA / SHA384withECDSA,该参数必填 375 ├── -mode # 签名模式,目前仅支持localSign,该参数必填 376 ├── -appCertFile # 应用签名证书(证书链,顺序为最终实体证书-中间CA证书-根证书),填写第二步生成的应用签名证书,该参数必填 377 ├── -profileFile # 签名后的profile文件,p7b格式,填写第三步中生成的profile文件,必填项 378 ├── -inFile # 输入原始应用包文件,该参数必填 379 ├── -keystoreFile # 密钥库文件,请与步骤一中密钥库文件保持一致,该参数必填且不可修改。java版本支持PKCS#12和JKS两种密钥库格式,C++版本仅支持PKCS#12密钥库格式 380 ├── -outFile # 输出签名后的包文件,必填项 381 ├── -keyPwd # 密钥口令,与第一步生成的密钥对口令保持一致 382 ├── -keystorePwd # 密钥库口令,与第一步的密钥库口令保持一致 383 ``` 384 385## Java版本工具常见问题 386 3871. 执行第二步生成应用签名证书命令时,控制台打印结果,无文件输出。 388 389 - **现象描述** 390 391 生成证书时,只在控制台打印证书内容,无对应文件输出。 392 393 - **可能原因** 394 395 outFile参数中路径不正确 和 '-outFile'中的'-'非英文格式。 396 397 - **解决办法** 398 399 检查并修正outFile参数为正确路径,'-outFile'中的'-'为英文格式 400 4012. 执行第三步对profile文件进行签名时,提示签名失败。 402 403 - **现象描述** 404 405 现象分为以下几种: 406 407 (1)执行命令后提示` "SIGN_ERROR, code: 107. Details: Failed to verify signature: Wrong key usage"` 408 409 (2)执行命令后提示 `"NOT_SUPPORT_ERROR, code: 105. Details: Profile cert 'result\profile1.pem' must a cert chain"` 410 411 (3)执行命令后提示` "VERIFY_ERROR, code: 108. Details: Failed to verify signature: unable to find valid certification path to requested target"` 412 413 - **可能原因** 414 415 (1)profile签名证书(最终实体证书)证书链顺序不正确。 416 417 (2)profile签名证书(最终实体证书)不是证书链。 418 419 (3)证书主题顺序不正确 或者 生成应用签名证书时“-issuerKeyAlias”参数填写错误。 420 421 - **解决办法** 422 423 (1)检查并修正证书链顺序,只能正序或反序,不可乱序。 424 425 (2)检查签名时的最终实体证书是否为证书链。 426 427 (3)检查证书主题顺序是否正确,顺序须为C、O、OU、CN。 428 4293. 对应用包进行签名时提示签名错误。 430 431 - **现象描述** 432 433 执行命令后提示:`NOT_SUPPORT_ERROR, code: 105. Details: SignAlg params is incorrect, signature algorithms include SHA256withECDSA,SHA384withECDSA`。 434 435 - **可能原因** 436 437 签名算法不支持,signAlg参数填写错误。 438 439 - **解决办法** 440 441 最终实体证书密钥对推荐使用ECC生成,hap签名算法修改为ECC对应的SHA256withECDSA,SHA384withECDSA。 442 4434. 签名应用包失败,提示证书CN字段为空。 444 445 - **现象描述** 446 447 执行命令后提示:`error: Common name of certificate is empty! `。 448 449 - **可能原因** 450 451 当前使用的应用包签名证书,不包含CN字段,导致签名失败。 452 453 - **解决办法** 454 455 根据业界证书规范,应用包签名证书的CN字段必须不为空,请重新生成格式正确的证书。 456 457 458## C++版本工具常见问题 459 460> **说明:** 461> 以下每个小条目按序号一一对应,比如现象描述的(1),对应可能原因的(1),对应解决办法的(1),以此类推。 462 4631. 命令行参数输入有误报错 464 465 + **现象描述** 466 467 (1)执行命令,报错提示:ERROR - COMMAND_PARAM_ERROR, code: -107. Details: 'generate-cert' Parameters error, Param key - value must in pairs 468 469 (2)执行命令,报错提示:ERROR - KEY_PASSWORD_ERROR, code: -114. Details: 'oh-app1-key-v1' keypair password error 470 471 (3)执行命令,报错提示:ERROR - NOT_SUPPORT_ERROR, code: -104. Details: Not support file: ./OpenHarmony.p1 472 473 (4)执行命令,报错提示:ERROR - KEY_ALIAS_ERROR, code: -109. Details: 'XXX' key alias already exists and cannot be generated repeatedly 474 475 + **可能原因** 476 477 (1)粘贴某条命令时,多粘贴了一段造成COMMAND_PARAM_ERROR错误,或者填写命令时,最后一个参数的value值忘记填写触发该COMMAND_PARAM_ERROR错误 478 479 (2)密钥对密码填写错误时,会触发 KEY_PASSWORD_ERROR错误 480 481 (3)填写了错误的密钥库文件类型,触发NOT_SUPPORT_ERROR错误 482 483 (4)密钥库中已存在该别名的密钥对,触发KEY_ALIAS_ERROR错误 484 485 + **解决办法** 486 487 (1)检查填写的命令是否有误,修正多余或错误的命令 488 489 (2)仔细检查命令中密码参数是否正确,访问不同密钥库获取密钥不要忘记填写各自的密钥对密码 490 491 (3)检查密钥库文件后缀是否为:`{.p12、.jks}` 492 493 (4)将需要生成密钥对的别名替换为其他的命名 494 4952. 执行生成应用签名证书命令时,提示参数错误。 496 497 - **现象描述** 498 499 (1)执行命令后,报错提示 ERROR - KEY_ALIAS_ERROR, code: -109. Details: keyAlias: 'oh-app1-key-v2' is not exist in/mnt/d/file/Test_0528/OpenHarmony.p12 500 501 (2)执行命令后,报错提示 ERROR - KEYSTORE_PASSWORD_ERROR, code: -115. Details: keyStore password error 502 503 (3)执行命令后,报错提示 ERROR - KEY_PASSWORD_ERROR, code: -114. Details: 'oh-app-sign-srv-ca-key-v1' keypair password error 504 505 - **可能原因** 506 507 (1)参数中的密钥别名在密钥库中找不到 508 509 (2)输入的密钥库密码输入错误 510 511 (3)生成app中间CA证书时输入的参数中有密钥对的密码,但是生成app调试证书没有输入-issuerKeyPwd参数 512 513 - **解决办法** 514 515 (1)检查密钥别名修改为与生成密钥对时输入的参数一致 516 517 (2)检查密钥库密码与生成密钥对时的输入的密钥库密码一致 518 519 (3)生成profile证书时,输入的参数必须有-issuerKeyPwd和对应的密码且与生成profile中间CA证书时密钥对的密码一致 520 5213. 执行profile文件进行签名时,提示签名失败。 522 523 - **现象描述** 524 525 (1)执行命令后,报错提示 :ERROR - PROVISION_INVALID, code: 0. Details: Tag app-distribution-type is empty 526 527 (2)执行命令后,报错提示 :VERIFY_ERROR, code: -106. Details: Failed to verify signature: unable to find valid certification path to requested target 528 529 - **可能原因** 530 531 (1)证书主题顺序不正确 或者 生成应用签名证书时“-issuerKeyAlias”参数填写错误 532 533 (2)profile.json中type值与bundle_info中的key值不对应 "type": "debug"对应"development-certificate","type": "release"对应"distribution-certificate" 534 535 - **解决办法** 536 537 (1)检查证书主题顺序是否正确,顺序须为C、O、OU、CN 538 539 (2)检查bundle.json文件配置信息 540 5414. 对应用包进行签名时提示签名错误。 542 543 - **现象描述** 544 545 (1)执行命令后,报错提示:ERROR - PROVISION_INVALID, code: 0. Details: Require build type must be debug or release 546 547 (2)执行命令后,报错提示:ERROR - ZIP_ERROR, code: -111. Details: zip init failed 548 549 (3)执行命令后,报错提示:ERROR - SIGN_ERROR, code: -105. Details: No certificates configured for sign 550 551 - **可能原因** 552 553 (1)profile文件并没有被签名(没有生成p7b文件),在进行hap签名之前profile文件里的不存在"type"键值信息 554 555 (2)输入的zip包超过了4G,压缩文件格式发生变化,导致解压错误 556 557 (3)签名使用的密钥和实体证书不匹配。 558 559 - **解决办法** 560 561 (1)当app签名时使用未签名的profile文件对hap包进行签名之前,在profile.json文件中添加"type"键,值对应debug或者release 562 563 (2)通过资源文件拆分、分包等方式降低hap包大小,最大不超过4G 564 565 (3)检查keyAlias密钥是否使用正确;检查appCertFile是否使用正确,确保密钥和证书匹配 566 5675. 安装hap包失败。 568 569 - **现象描述** 570 571 (1)使用release或debug类型的json文件签名安装hap包失败,报错提示:device type is not supports 572 573 (2)使用debug类型的json文件安装hap包失败,报错提示:verify pkcs7 info falied 574 575 (3)使用低版本的openharmony系统安装hap包失败,报错提示:install sign info inconsistent 576 577 (4)已签名的hap安装报错提示:signature verification failed due to not trusted app source. 578 579 - **可能原因** 580 581 (1)openharmmony系统的配置文件不支持该app包的设备类型 582 583 (2)debug类型的json文件中device-ids中没有你的设备udid 584 585 (3)安装了相同包名的hap包 586 587 (4)debug或者release类型json文件中的证书不是受信的证书 588 589 - **解决办法** 590 591 (1)使用 `hdc shell param get const.product.devicetype` 查看系统支持的设备类型,根据设备类型来替换hap包类型 592 593 (2)使用 `hdc shell bm get --udid` 获取设备的设备udid,并将获取的udid加入debug类型json文件中device-ids项中 594 595 (3)使用 `bm uninstall -n + 包名` 卸载原来安装的同包名hap包 596 597 (4)检查是否使用了错误的json文件 598