• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Hap包签名工具指导
2
3## 编译构建
4
5 1. 该工具基于Gradle 7.1编译构建,请确认环境已安装配置Gradle环境,并且版本高于或等于7.1。
6
7    ```shell
8    gradle -v
9    ```
10
11 2. 下载代码,命令行打开文件目录至developtools_hapsigner/hapsigntool,执行命令进行编译打包。
12
13    ```shell
14    gradle build
15    ```
1617    ```shell
18    gradle jar
19    ```
20
21 3. 编译后得到二进制文件,目录为: ./hap_sign_tool/build/libs/hap-sign-tool.jar22
23## 开发指导
24
25### 场景介绍
26
27OpenHarmony系统内置密钥库文件,文件名称为OpenHarmony.p12,内含根CA证书、中间CA证书、最终实体证书等信息,工具基于该密钥库文件对OpenHarmony应用进行签名。
28
29按照有无应用签名证书可分为以下两种场景:
30
311. 无应用签名证书场景:
32   开发者使用该工具对Hap包签名时,需按照签名步骤从第一步生成应用签名证书密钥对依次完成应用签名证书生成、profile文件签名、应用签名流程。
332. 有应用签名证书场景:
34   开发者可直接从签名步骤第三步对profile文件进行签名开始开发,使用应用签名证书和包含对应密钥的本地密钥库文件对应用进行签名。
35
36### 命令说明
37
381. 输出命令帮助信息。
39
40     ```
41     -help     # 输出命令帮助信息(不输入参数默认输出命令帮助信息)
42     ```
43
442. 输出版本信息。
45
46     ```
47     -version  # 输出版本信息
48     ```
49
503. 生成密钥对。
51
52     ```
53     generate-keypair : 生成密钥对
54         ├── -keyAlias          # 密钥别名,必填项
55         ├── -keyPwd            # 密钥口令,可选项
56         ├── -keyAlg            # 密钥算法,必填项,包括RSA/ECC
57         ├── -keySize           # 密钥长度,必填项,RSA算法的长度为2048/3072/4096,ECC算法的长度NIST-P-256/NIST-P-384
58         ├── -keystoreFile      # 密钥库文件,必填项,JKS或P12格式
59         ├── -keystorePwd       # 密钥库口令,可选项
60     ```
61
624. 生成证书签名请求。
63     ```
64     generate-csr : 生成证书签名请求
65         ├── -keyAlias          # 密钥别名,必填项
66         ├── -keyPwd            # 密钥口令,可选项
67         ├── -subject           # 证书主题,必填项
68         ├── -signAlg           # 签名算法,必填项,包括SHA256withRSA / SHA384withRSA / SHA256withECDSA / SHA384withECDSA
69         ├── -keystoreFile      # 密钥库文件,必填项,JKS或P12格式
70         ├── -keystorePwd       # 密钥库口令,可选项
71         ├── -outFile           # 输出文件,可选项,如果不填,则直接输出到控制台
72     ```
73
745. 生成根CA/中间CA证书。
75
76     ```
77     generate-ca : 生成根CA/中间CA证书,如果密钥不存在,一起生成密钥
78         ├── -keyAlias                        # 密钥别名,必填项
79         ├── -keyPwd                          # 密钥口令,可选项
80         ├── -keyAlg                          # 密钥算法,必填项,包括RSA/ECC
81         ├── -keySize                         # 密钥长度,必填项,RSA算法的长度为2048/3072/4096,ECC算法的长度NIST-P-256/NIST-P-384
82         ├── -issuer                          # 颁发者的主题,可选项,如果不填,表示根CA
83         ├── -issuerKeyAlias                  # 颁发者的密钥别名,可选项,如果不填,表示根CA
84         ├── -issuerKeyPwd                    # 颁发者的密钥口令,可选项
85         ├── -subject                         # 证书主题,必填项
86         ├── -validity                        # 证书有效期,可选项,默认为3650天
87         ├── -signAlg                         # 签名算法,必填项,包括SHA256withRSA / SHA384withRSA / SHA256withECDSA / SHA384withECDSA
88         ├── -basicConstraintsPathLen         # 路径长度,可选项,默认为0
89         ├── -keystoreFile                    # 密钥库文件,必填项,JKS或P12格式
90         ├── -keystorePwd                     # 密钥库口令,可选项
91         ├── -issuerKeystoreFile              # 签发者密钥库文件,可选项,JKS或P12格式
92         ├── -issuerKeystorePwd               # 签发者密钥库口令,可选项
93         ├── -outFile                         # 输出文件,可选项,如果不填,则直接输出到控制台
94     ```
95
966. 生成应用调试/发布证书。
97
98     ```
99     generate-app-cert : 生成应用调试/发布证书
100         ├── -keyAlias                        # 密钥别名,必填项
101         ├── -keyPwd                          # 密钥口令,可选项
102         ├── -issuer                          # 颁发者的主题,必填项
103         ├── -issuerKeyAlias                  # 颁发者的密钥别名,必填项
104         ├── -issuerKeyPwd                    # 颁发者的密钥口令,可选项
105         ├── -subject                         # 证书主题,必填项
106         ├── -validity                        # 证书有效期,可选项,默认为3650天
107         ├── -signAlg                         # 签名算法,必填项,包括SHA256withECDSA / SHA384withECDSA;
108         ├── -issuerKeystoreFile              # 签发者密钥库文件,可选项,JKS或P12格式
109         ├── -issuerKeystorePwd               # 签发者密钥库口令,可选项
110         ├── -keystoreFile                    # 密钥库文件,必填项,JKS或P12格式
111         ├── -keystorePwd                     # 密钥库口令,可选项
112         ├── -outForm                         # 输出证书文件的格式,包括 cert / certChain,可选项,默认为certChain
113         ├── -rootCaCertFile                  #  outForm为certChain时必填,根CA证书文件
114         ├── -subCaCertFile                   #  outForm为certChain时必填,中间CA证书文件
115         ├── -outFile                         #  输出证书文件(证书或证书链),可选项,如果不填,则直接输出到控制台
116     ```
117
1187. 生成profile调试/发布证书。
119
120     ```
121     generate-profile-cert : 生成profile调试/发布证书
122         ├── -keyAlias                        # 密钥别名,必填项
123         ├── -keyPwd                          # 密钥口令,可选项
124         ├── -issuer                          # 颁发者的主题,必填项
125         ├── -issuerKeyAlias                  # 颁发者的密钥别名,必填项
126         ├── -issuerKeyPwd                    # 颁发者的密钥口令,可选项
127         ├── -subject                         # 证书主题,必填项
128         ├── -validity                        # 证书有效期,可选项,默认为3650天
129         ├── -signAlg                         # 签名算法,必填项,包括SHA256withECDSA / SHA384withECDSA;
130         ├── -issuerKeystoreFile              # 签发者密钥库文件,可选项,JKS或P12格式
131         ├── -issuerKeystorePwd               # 签发者密钥库口令,可选项
132         ├── -keystoreFile                    # 密钥库文件,必填项,JKS或P12格式
133         ├── -keystorePwd                     # 密钥库口令,可选项
134         ├── -outForm                         # 输出证书文件的格式,包括 cert / certChain,可选项,默认为certChain
135         ├── -rootCaCertFile                  #  outForm为certChain时必填,根CA证书文件
136         ├── -subCaCertFile                   #  outForm为certChain时必填,中间CA证书文件
137         ├── -outFile                         #  输出证书文件(证书或证书链),可选项,如果不填,则直接输出到控制台
138     ```
139
1408. 通用证书生成,可以生成自定义证书。
141
142     ```
143     generate-cert : 通用证书生成,可以生成自定义证书
144         ├── -keyAlias                          # 密钥别名,必填项
145         ├── -keyPwd                            # 密钥口令,可选项
146         ├── -issuer                            # 颁发者的主题,必填项
147         ├── -issuerKeyAlias                    # 颁发者的密钥别名,必填项
148         ├── -issuerKeyPwd                      # 颁发者的密钥口令,可选项
149         ├── -subject                           # 证书主题,必填项
150         ├── -validity                          # 证书有效期,可选项,默认为1095天
151         ├── -keyUsage                          # 密钥用法,必选项,包括digitalSignature, nonRepudiation, keyEncipherment,
152         ├                                        dataEncipherment, keyAgreement, certificateSignature, crlSignature,
153         ├                                        encipherOnly和decipherOnly,如果证书包括多个密钥用法,用逗号分隔
154         ├── -keyUsageCritical                  # keyUsage是否为关键项,可选项,默认为是
155         ├── -extKeyUsage                       # 扩展密钥用法,可选项,包括clientAuthentication,serverAuthentication,
156         ├                                        codeSignature,emailProtection,smartCardLogin,timestamp,ocspSignature
157         ├── -extKeyUsageCritical               # extKeyUsage是否为关键项,可选项,默认为否
158         ├── -signAlg                           # 签名算法,必填项,包括SHA256withRSA/SHA384withRSA/SHA256withECDSA/SHA384withECDSA
159         ├── -basicConstraints                  # 是否包含basicConstraints,可选项,默认为否
160         ├── -basicConstraintsCritical          # basicConstraints是否包含为关键项,可选项,默认为否
161         ├── -basicConstraintsCa                # 是否为CA,可选项,默认为否
162         ├── -basicConstraintsPathLen           # 路径长度,可选项,默认为0
163         ├── -issuerKeystoreFile                # 签发者密钥库文件,可选项,JKS或P12格式
164         ├── -issuerKeystorePwd                 # 签发者密钥库口令,可选项
165         ├── -keystoreFile                      # 密钥库文件,必填项,JKS或P12格式
166         ├── -keystorePwd                       # 密钥库口令,可选项
167         ├── -outFile                           # 输出证书文件,可选项,如果不填,则直接输出到控制台
168     ```
169
1709. profile文件签名。
171
172     ```
173     sign-profile : profile文件签名
174         ├── -mode            # 签名模式,必填项,包括localSign,remoteSign
175         ├── -keyAlias        # 密钥别名,必填项
176         ├── -keyPwd          # 密钥口令,可选项
177         ├── -profileCertFile # Profile签名证书(证书链,顺序为最终实体证书-中间CA证书-根证书),必填项
178         ├── -inFile          # 输入原始的模板Profile文件,文件为json格式,所在目录为developtools_hapsigner/autosign/UnsgnedReleasedProfileTemplate.json,必填项
179         ├── -signAlg         # 签名算法,必填项,包括SHA256withECDSA / SHA384withECDSA
180         ├── -keystoreFile    # 密钥库文件,localSign模式时为必填项,JKS或P12格式
181         ├── -keystorePwd     # 密钥库口令,可选项
182         ├── -outFile         # 输出签名后的profile文件,p7b格式,必填项
183     ```
184
18510. profile文件验签。
186
187     ```
188     verify-profile : profile文件验签
189         ├── -inFile       # 已签名的profile文件,p7b格式,必填项
190         ├── -outFil       # 验证结果文件(包含验证结果和profile内容),json格式,可选项;如果不填,则直接输出到控制台
191     ```
192
19311. hap应用包签名。
194
195      ```
196      sign-app : hap应用包签名
197          ├── -mode          # 签名模式,必填项,包括localSign,remoteSign,remoteResign
198          ├── -keyAlias      # 密钥别名,必填项
199          ├──-keyPwd         # 密钥口令,可选项
200          ├── -appCertFile   # 应用签名证书文件(证书链,顺序为最终实体证书-中间CA证书-根证书),必填项
201          ├── -profileFile   # 签名后的profile文件名,p7b格式,必填项
202          ├── -profileSigned # 指示profile文件是否带有签名,1表示有签名,0表示没有签名,默认为1。可选项
203          ├── -inForm        # 输入的原始文件的格式,zip格式或bin格式,默认zip格式,可选项
204          ├── -inFile        # 输入的原始APP包文件,hap格式或bin格式,必填项
205          ├── -signAlg       # 签名算法,必填项,包括SHA256withECDSA / SHA384withECDSA
206          ├── -keystoreFile  # 密钥库文件,localSign模式时为必填项,JKS或P12格式
207          ├── -keystorePwd   # 密钥库口令,可选项
208          ├── -outFile       # 输出签名后的包文件,必填项
209      ```
210
21112. hap应用包文件验签。
212
213      ```
214      verify-app : hap应用包文件验签
215          ├── -inFile          # 已签名的应用包文件,hap格式或bin格式,必填项
216          ├── -outCertchain    # 签名的证书链文件,必填项
217          ├── -outProfile      # 应用包中的profile文件,必填项
218      ```
219
220### 签名步骤
221对hap包签名的完整步骤为:
222
223- 生成应用签名证书密钥对
224- 生成应用签名证书
225- 对profile文件进行签名
226- 对Hap包进行签名
227
228
229> **注意事项:** <br/>
230>
231> 1. 步骤一中的密钥对算法推荐使用ECC,出于安全性考虑,应用签名暂不使用RSA算法。
232> 2. 建议将待签名hap包、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**
233
2341. **生成应用签名证书密钥对**
235
236   调用密钥对生成接口,生成签名密钥并保存到密钥库。
237
238   命令实例:
239
240   ```shell
241   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"
242   ```
243
244   > **说明:** 请记录下**keyAlias、keyStorePwd**和**keyPwd**的值,在后续生成应用  签名证书和对Hap包进行签名操作会使用到。
245
246   该命令的参数说明:
247
248   ```
249   generate-keypair : 生成应用签名证书密钥对
250       ├── -keyAlias         #用于生成应用签名证书的密钥别名,存于OpenHarmony.p12密钥库文件中,该参数必填
251       ├── -keyAlg           #密钥算法,推荐使用ECC,该参数必填
252       ├── -keySize          #密钥长度,ECC算法的长度NIST-P-256/NIST-P-384,该参数必填
253       ├── -keyStoreFile     #密钥库文件,推荐使用提供的OpenHarmony.p12密钥库文件,该参数必填
254       ├── -keyStorePwd      #密钥库口令,OpenHarmony.p12口令默认为“123456”,必填项
255       ├── -keyPwd           #密钥口令,可选项,该参数不填默认生成的密钥对无口令
256   ```
257
2582. **生成应用签名证书**
259
260   调用应用签名证书生成接口,使用本地中间CA证书签发应用签名证书。
261
262   命令实例:
263
264   ```shell
265   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"
266   ```
267
268   该命令的参数说明:
269
270   ```
271   generate-app-cert:生成应用签名证书
272       ├── -keyAlias         # 用于生成应用签名证书的密钥别名,请与第一步生成密钥对的密钥别名-keyAlias保持一致
273       ├── -signAlg          # 签名算法,必填项,包括 SHA256withECDSA / SHA384withECDSA
274       ├── -issuer           # 颁发者主题,填写已提供的中间CA证书主题,该参数必填且不能修改
275       ├── -issuerKeyAlias   # 颁发者密钥别名,填写中间CA证书密钥别名,该参数必填且不能修改
276       ├── -subject          # 证书主题,请参照命令实例中内容保证顺序不变,该参数必填
277       ├── -issuerKeyPwd     # 颁发者密钥口令,填写中间CA证书密钥口令,该参数必填,指定“123456”,不可修改
278       ├── -keystoreFile     # 密钥库文件,指定使用提供的OpenHarmony.p12密钥库文件,该参数必填且不可修改
279       ├── -rootCaCertFile   # 根CA证书文件,指定为已提供的根CA证书,该参数必填且不可修改
280       ├── -subCaCertFile    # 中间CA证书文件,指定为已提供的中间CA证书,该参数必填且不可修改
281       ├── -outForm          # 输出证书文件格式,推荐使用certChain
282       ├── -outFile          # 可选项,建议填写,不填则默认输出到控制台
283       ├── -keyPwd           # 密钥口令,可选项,为第一步生成的密钥对口令
284       ├── -keystorePwd      # 密钥库口令,默认为“123456”
285       ├── -validity         # 证书有效期,可选项,默认为3650天
286   ```
287
2883. **对profile文件进行签名**
289
290   调用profile文件签名接口,使用Profile签名密钥对profile文件进行签名。
291
292   命令实例:
293
294   ```shell
295   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"
296   ```
297
298   该命令的参数说明:
299
300   ```
301   sign-profile:签名profile文件
302       ├── -keyAlias         # 生成profile证书的密钥别名,该参数必填且不能修改
303       ├── -signAlg          # 签名算法,包括 SHA256withECDSA / SHA384withECDSA,该参数必填
304       ├── -mode             # 签名模式,目前仅支持localSign,该参数必填
305       ├── -profileCertFile  # Profile签名证书,指定已提供的profile证书文件,该参数必填且不可修改
306       ├── -inFile           # 输入原始的模板Profile文件,文件为json格式,所在目录为developtools_hapsigner/autosign/UnsgnedReleasedProfileTemplate.json,该参数必填
307       ├── -keystoreFile     # 密钥库文件,指定使用提供的OpenHarmony.p12密钥库文件,该参数必填且不可修改
308       ├── -outFile          # 输出签名后的profile文件,p7b格式,该参数必填
309       ├── -keyPwd           # 密钥口令,OpenHarmony.p12中的口令默认“123456”
310       ├── -keystorePwd      # 密钥库口令,OpenHarmony.p12口令默认为“123456”
311   ```
312
3134. **对Hap包进行签名**
314
315   调用Hap包签名接口,使用应用签名密钥为Hap包签名。
316
317   命令实例:
318
319   ```shell
320   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"
321   ```
322   > **说明**:以下参数说明默认为无应用签名证书场景,当开发场景为有应用签名证书场景时,下列参数需要修改:
323   > -keyAlias:密钥别名,填写已有应用签名证书对应的密钥别名,参数必填。
324   > -appCertFile:应用签名证书,填写已有的应用签名证书,参数必填。
325   > -keystoreFile:密钥库文件,填写已有应用签名证书对应的密钥库文件,参数必填。
326   > -keyPwd:密钥口令,填写密钥库文件中对应密钥的口令。
327   > -keystorePwd:密钥库口令,填写密钥库文件的密钥口令。
328
329   该命令的参数说明:
330
331   ```
332   sign-app:签名Hap包
333       ├── -keyAlias          # 密钥别名,为第一步生成的密钥信息别名,该参数必填
334       ├── -signAlg           # 签名算法,包括 SHA256withECDSA / SHA384withECDSA,该参数必填
335       ├──  -mode             # 签名模式,目前仅支持localSign,该参数必填
336       ├──  -appCertFile      # 应用签名证书(证书链,顺序为最终实体证书-中间CA证书-根证书),填写第二步生成的应用签名证书,该参数必填
337       ├──  -profileFile      # 签名后的profile文件,p7b格式,填写第三步中生成的profile文件,必填项
338       ├──  -inFile           # 输入原始APP包文件,该参数必填
339       ├──  -keystoreFile     # 密钥库文件,请与步骤一中密钥库文件保持一致,该参数必填且不可修改
340       ├──  -outFile          # 输出签名后的包文件,必填项
341       ├──  -keyPwd           # 密钥口令,与第一步生成的密钥对口令保持一致
342       ├──  -keystorePwd      # 密钥库口令,与第一步的密钥库口令保持一致
343   ```
344
345
346## 常见问题
347
3481. 执行第二步生成应用签名证书命令时,控制台打印结果,无文件输出。
349
350   - **现象描述**
351
352     生成证书时,只在控制台打印证书内容,无对应文件输出。
353
354   - **可能原因**
355
356     outFile参数中路径不正确 和 '-outFile'中的'-'非英文格式。
357
358   - **解决办法**
359
360     检查并修正outFile参数为正确路径,'-outFile'中的'-'为英文格式
361
3622. 执行第三步对profile文件进行签名时,提示签名失败。
363
364   - **现象描述**
365
366     现象分为以下几种:
367
368     (1)执行命令后提示` "SIGN_ERROR, code: 107. Details: Failed to verify signature: Wrong key usage"`
369
370     (2)执行命令后提示 `"NOT_SUPPORT_ERROR, code: 105. Details: Profile cert 'result\profile1.pem' must a cert chain"`
371
372     (3)执行命令后提示` "VERIFY_ERROR, code: 108. Details: Failed to verify signature: unable to find valid certification path to requested target"`
373
374   - **可能原因**
375
376     (1)profile签名证书(最终实体证书)证书链顺序不正确。
377
378     (2)profile签名证书(最终实体证书)不是证书链。
379
380     (3)证书主题顺序不正确 或者 生成应用签名证书时“-issuerKeyAlias”参数填写错误。
381
382   - **解决办法**
383
384     (1)检查并修正证书链顺序,只能正序或反序,不可乱序。
385
386     (2)检查签名时的最终实体证书是否为证书链。
387
388     (3)检查证书主题顺序是否正确,顺序须为C、O、OU、CN。
389
3903. 对Hap包进行签名时提示签名错误。
391
392   - **现象描述**
393
394     执行命令后提示:`NOT_SUPPORT_ERROR, code: 105. Details: SignAlg params is incorrect, signature algorithms include SHA256withECDSA,SHA384withECDSA`。
395
396   - **可能原因**
397
398     签名算法不支持,signAlg参数填写错误。
399
400   - **解决办法**
401
402     最终实体证书密钥对推荐使用ECC生成,hap签名算法修改为ECC对应的SHA256withECDSA,SHA384withECDSA。
403