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