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