1# 证书管理开发指导
2
3> **说明**
4>
5> 本开发指导需使用API version 11及以上版本SDK。
6
7## 场景说明
8
91. 典型场景:
10
11   - 安装应用证书和私有凭据。
12
13   - 获取应用证书和私有凭据。
14
15   - 使用应用证书和私有凭据对数据进行签名、验签。
16
17   - 卸载指定的应用证书和私有凭据。
18
192. 支持安装的私有凭据算法类型&签名验签支持的参数组合。
20
21   证书管理安装凭据及使用凭据中的密钥进行签名、验签,依赖[通用密钥库](../UniversalKeystoreKit/huks-overview.md)(HUKS)能力,证书管理支持的算法为其子集,当前仅支持RSA及ECC算法类型的私有凭据安装及使用。签名、验签支持的参数组合,详见HUKS声明的[签名/验签介绍及算法规格](../UniversalKeystoreKit/huks-signing-signature-verification-overview.md)中RSA及ECC的描述。
22
23
24## 接口说明
25
26详细接口说明可参考[API参考](../../reference/apis-device-certificate-kit/js-apis-certManager.md)。
27
28以上场景涉及的常用接口如下表所示:
29
30| 实例名          | 接口名                                                       | 描述                                         |
31| --------------- | ------------------------------------------------------------ | -------------------------------------------- |
32| certificateManager        | installPrivateCertificate(keystore: Uint8Array, keystorePwd: string, certAlias: string, callback: AsyncCallback\<CMResult>) : void  | 使用callback方式安装应用私有凭据                 |
33| certificateManager        | installPrivateCertificate(keystore: Uint8Array, keystorePwd: string, certAlias: string) : Promise\<CMResult> | 使用promise方式安装应用私有凭据                  |
34| certificateManager        | getPrivateCertificate(keyUri: string, callback: AsyncCallback\<CMResult>) : void    | 使用callback方式获取应用私有凭据          |
35| certificateManager        | getPrivateCertificate(keyUri: string) : Promise\<CMResult>                         | 使用promise方式获取应用私有凭据           |
36| certificateManager        | uninstallPrivateCertificate(keyUri: string, callback: AsyncCallback\<void>) : void  | 使用callback方式卸载应用私有凭据         |
37| certificateManager        | uninstallPrivateCertificate(keyUri: string) : Promise\<void> | 使用promise方式卸载应用私有凭据 |
38| certificateManager | init(authUri: string, spec: CMSignatureSpec, callback: AsyncCallback\<CMHandle>) : void | 使用callback方式进行签名验签的初始化操作 |
39| certificateManager | init(authUri: string, spec: CMSignatureSpec) : Promise\<CMHandle>  | 使用promise方式进行签名验签的初始化操作  |
40| certificateManager        | update(handle: Uint8Array, data: Uint8Array, callback: AsyncCallback\<void>) : void         | 使用callback方式对待签名、验签的数据进行更新操作         |
41| certificateManager        | update(handle: Uint8Array, data: Uint8Array) : Promise\<void> | 使用promise方式对待签名、验签的数据进行更新操作 |
42| certificateManager        | finish(handle: Uint8Array, callback: AsyncCallback\<CMResult>) : void         | 使用callback方式完成数据的签名操作         |
43| certificateManager        | finish(handle: Uint8Array, signature: Uint8Array, callback: AsyncCallback\<CMResult>) : void     | 使用callback方式完成数据的签名操作         |
44| certificateManager        | finish(handle: Uint8Array, signature?: Uint8Array) : Promise\<CMResult> | 使用promise方式完成数据的签名、验签操作 |
45| certificateManager        | abort(handle: Uint8Array, callback: AsyncCallback\<void>) : void         | 使用callback方式中止签名、验证操作         |
46| certificateManager        | abort(handle: Uint8Array) : Promise\<void> | 使用promise方式中止签名、验证操作 |
47
48## 开发步骤
49
501. 申请权限。调用证书管理相关接口,需要在module.json5文件的requestPermissions对象中配置ohos.permission.ACCESS_CERT_MANAGER权限。更多配置信息请参考[Stage模型应用程序包结构](../../quick-start/module-configuration-file.md)。
51
522. 导入相关模块。
53
54   ```ts
55   import { certificateManager } from '@kit.DeviceCertificateKit';
56   import { BusinessError } from '@kit.BasicServicesKit';
57   ```
583. 安装应用私有凭据,获取应用私有凭据,并使用应用私有凭据进行签名、验签,最后删除应用私有凭据。
59
60   ```ts
61   async function certificateManagerSample() {
62     /* 安装的凭据数据需要业务赋值,本例数据非凭据数据 */
63     let keystore: Uint8Array = new Uint8Array([
64       0x30, 0x82, 0x04, 0x6a, 0x02, 0x01,
65     ]);
66
67     /* 安装凭据对应的密码,业务赋值 */
68     let keystorePwd: string = '123456';
69     let appKeyUri: string = '';
70     try {
71       /* 安装私有凭据 */
72       const res: certificateManager.CMResult = await certificateManager.installPrivateCertificate(keystore, keystorePwd, "testPriCredential");
73       appKeyUri = (res.uri != undefined) ? res.uri : '';
74     } catch (err) {
75       let e: BusinessError = err as BusinessError;
76       console.error(`Failed to install private certificate. Code: ${e.code}, message: ${e.message}`);
77     }
78
79     try {
80       /* srcData为待签名、验签的数据,业务自行赋值 */
81       let srcData: Uint8Array = new Uint8Array([
82         0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01,
83     ]);
84
85       /* 构造签名的属性参数 */
86       const signSpec: certificateManager.CMSignatureSpec = {
87         purpose: certificateManager.CmKeyPurpose.CM_KEY_PURPOSE_SIGN,
88         padding: certificateManager.CmKeyPadding.CM_PADDING_PSS,
89         digest: certificateManager.CmKeyDigest.CM_DIGEST_SHA256
90       };
91
92       /* 签名 */
93       const signHandle: certificateManager.CMHandle = await certificateManager.init(appKeyUri, signSpec);
94       await certificateManager.update(signHandle.handle, srcData);
95       const signResult: certificateManager.CMResult = await certificateManager.finish(signHandle.handle);
96
97       /* 构造验签的的属性参数 */
98       const verifySpec: certificateManager.CMSignatureSpec = {
99         purpose: certificateManager.CmKeyPurpose.CM_KEY_PURPOSE_VERIFY,
100         padding: certificateManager.CmKeyPadding.CM_PADDING_PSS,
101         digest: certificateManager.CmKeyDigest.CM_DIGEST_SHA256
102       };
103
104       /* 验签 */
105       const verifyHandle: certificateManager.CMHandle = await certificateManager.init(appKeyUri, verifySpec);
106       await certificateManager.update(verifyHandle.handle, srcData);
107       const verifyResult = await certificateManager.finish(verifyHandle.handle, signResult.outData);
108       console.info('Succeeded in signing and verifying.');
109     } catch (err) {
110       let e: BusinessError = err as BusinessError;
111       console.error(`Failed to sign or verify. Code: ${e.code}, message: ${e.message}`);
112     }
113
114     try {
115       /* 卸载私有凭据 */
116       await certificateManager.uninstallPrivateCertificate(appKeyUri);
117     } catch (err) {
118       let e: BusinessError = err as BusinessError;
119       console.error(`Failed to uninstall private certificate. Code: ${e.code}, message: ${e.message}`);
120     }
121   }
122   ```
123