证书管理

证书管理主要提供系统级的证书管理能力,通过证书管理模块可以确保证书在传输和存储过程中的安全性,防止未经授权的访问和使用。当前提供了应用私有凭据的安装、获取、使用及卸载能力。通过证书管理能力,可以实现证书全生命周期(安装、存储、使用和销毁)的管理和安全使用。

 

常见使用场景

安装应用私有凭据,获取应用私有凭据,并使用应用私有凭据进行签名、验签,最后删除应用私有凭据。

 

证书管理概述

证书管理主要提供系统级的证书管理能力,实现证书全生命周期(安装、存储、使用和销毁)的管理和安全使用。

 

证书管理基本概念

证书:经证书授权中心(CA)数字签名的、包含公钥拥有者信息以及公钥的文件。常见的证书文件格式为X509证书。

凭据:指的是证书文件中公钥所对应的私钥信息。

密钥库:包含证书和凭据的文件。常见的密钥库文件格式为P12文件(PKCS#12)。

签名:使用私钥对需要传输的文件摘要进行加密得到的密文。

验签:用公钥对签名密文进行解密,得到文本的摘要,然后使用与发送方同样的方法对文本计算摘要值,再与解密得到的摘要做对比,二者一致则说明文本没有被篡改过。

 

证书生命周期管理概述

实现业务证书和CA证书的安装、存储、使用和销毁管理,保证证书安全使用。

证书安装:使用者可以通过安装接口,传入证书文件或密钥库文件,实现证书的安装。

证书存储:证书管理模块将安装后的证书存储在证书管理服务私有目录下,对应的证书对应的私钥凭据存储在HUKS模块中。

证书使用:通过查询对应的证书,使用者可获取到证书文件进行业务相关操作;并可以使用证书管理服务提供接口使用证书和私钥进行签名和验签。

证书销毁:删除接口允许使用者,批量或单张销毁存储在证书管理中的证书和凭据。

 

场景说明

典型场景:

1、安装应用证书和私有凭据。

2、获取应用证书和私有凭据。

3、使用应用证书和私有凭据对数据进行签名、验签。

4、卸载指定的应用证书和私有凭据。

 

应用层代码示例:

import { certificateManager } from '@kit.DeviceCertificateKit';
import { BusinessError } from '@kit.BasicServicesKit';

async function certificateManagerSample() {
  /* 安装的凭据数据需要业务赋值,本例数据非凭据数据 */
  let keystore: Uint8Array = new Uint8Array([
    0x30, 0x82, 0x04, 0x6a, 0x02, 0x01,
  ]);

  /* 安装凭据对应的密码,业务赋值 */
  let keystorePwd: string = '123456';
  let appKeyUri: string = '';
  try {
    /* 安装私有凭据 */
    const res: certificateManager.CMResult = await certificateManager.installPrivateCertificate(keystore, keystorePwd, "testPriCredential");
    appKeyUri = (res.uri != undefined) ? res.uri : '';
  } catch (err) {
    let e: BusinessError = err as BusinessError;
    console.error(`Failed to install private certificate. Code: ${e.code}, message: ${e.message}`);
  }

  try {
    /* srcData为待签名、验签的数据,业务自行赋值 */
    let srcData: Uint8Array = new Uint8Array([
      0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01,
  ]);

    /* 构造签名的属性参数 */
    const signSpec: certificateManager.CMSignatureSpec = {
      purpose: certificateManager.CmKeyPurpose.CM_KEY_PURPOSE_SIGN,
      padding: certificateManager.CmKeyPadding.CM_PADDING_PSS,
      digest: certificateManager.CmKeyDigest.CM_DIGEST_SHA256
    };

    /* 签名 */
    const signHandle: certificateManager.CMHandle = await certificateManager.init(appKeyUri, signSpec);
    await certificateManager.update(signHandle.handle, srcData);
    const signResult: certificateManager.CMResult = await certificateManager.finish(signHandle.handle);

    /* 构造验签的的属性参数 */
    const verifySpec: certificateManager.CMSignatureSpec = {
      purpose: certificateManager.CmKeyPurpose.CM_KEY_PURPOSE_VERIFY,
      padding: certificateManager.CmKeyPadding.CM_PADDING_PSS,
      digest: certificateManager.CmKeyDigest.CM_DIGEST_SHA256
    };

    /* 验签 */
    const verifyHandle: certificateManager.CMHandle = await certificateManager.init(appKeyUri, verifySpec);
    await certificateManager.update(verifyHandle.handle, srcData);
    const verifyResult = await certificateManager.finish(verifyHandle.handle, signResult.outData);
    console.info('Succeeded in signing and verifying.');
  } catch (err) {
    let e: BusinessError = err as BusinessError;
    console.error(`Failed to sign or verify. Code: ${e.code}, message: ${e.message}`);
  }

  try {
    /* 卸载私有凭据 */
    await certificateManager.uninstallPrivateCertificate(appKeyUri);
  } catch (err) {
    let e: BusinessError = err as BusinessError;
    console.error(`Failed to uninstall private certificate. Code: ${e.code}, message: ${e.message}`);
  }
}


 

系统层部分接口源码分析及调用顺序

接口1:certificateManager.installPrivateCertificate(keystore, keystorePwd, "testPriCredential");  安装应用证书和私有凭据

第一步:

通过 @ohos.security.certManager (证书管理模块)

找到路径base/security/certificate_manager/interfaces/kits/napi/src/cm_napi.cpp,在这个文件中定义了@ohos.security.certManager相关的模块名

 

第二步:

通过API的名字installPrivateCertificate找到路径base/security/certificate_manager/interfaces/kits/napi/src/cm_napi.cpp中对应的映射函数CMNapiInstallPrivateAppCert

第三步:

CMNapiInstallPrivateAppCert调用CMNapiInstallAppCertCommon(env, info, APPLICATION_PRIVATE_CERTIFICATE_STORE);参数标志位为APPLICATION_PRIVATE_CERTIFICATE_STORE。

第四步:

上一步红圈跳转到函数CMNapiInstallAppCertCommon

路径base/security/certificate_manager/interfaces/kits/napi/src/cm_napi_install_app_cert_common.cpp

函数逻辑可以查看如下代码注释部分

 

第五步:

跟着红圈部分继续跳转到函数InstallAppCertAsyncWork

路径base/security/certificate_manager/interfaces/kits/napi/src/cm_napi_install_app_cert_common.cpp

函数逻辑可以查看如下代码注释部分

 

第六步:

调用CmInstallAppCert函数,路径base/security/certificate_manager/interfaces/innerkits/cert_manager_standard/main/src/cert_manager_api.c

 

第七步:

调用CmClientInstallAppCert函数,路径base/security/certificate_manager/frameworks/cert_manager_standard/main/os_dependency/cm_ipc/src/cm_ipc_client.c

 

第八步:

通过SendRequest将数据发送到证书管理服务器进行处理,通过CM_MSG_INSTALL_APP_CERTIFICATE告知服务器,数据类型为证书安装操作,

路径:base/security/certificate_manager/frameworks/cert_manager_standard/main/os_dependency/cm_ipc/src/cm_ipc_client.c

 

第九步:

通过CM_MSG_INSTALL_APP_CERTIFICATE查找到服务函数,路径:base/security/certificate_manager/services/cert_manager_standard/cert_manager_service/main/os_dependency/sa/cm_sa.cpp

 

第十步:

跳转到路径base/security/certificate_manager/services/cert_manager_standard/cert_manager_service/main/os_dependency/idl/cm_ipc/cm_ipc_service.c

第十一步:

跳转到红圈函数,路径base/security/certificate_manager/services/cert_manager_standard/cert_manager_engine/main/core/src/cert_manager_service.c

 

第十二步:

函数CmInstallAppCertPro,路径base/security/certificate_manager/services/cert_manager_standard/cert_manager_engine/main/core/src/cert_manager_app_cert_process.c

函数详解看注释部分

 

总结:

  此文提供certificate_manager提供的API分析思路,上述API接口只分析了certificateManager.installPrivateCertificate,剩下的certificateManager.init、certificateManager.update、certificateManager.finish、certificateManager.uninstallPrivateCertificate的调用流程跟certificateManager.installPrivateCertificate是一样的,感兴趣的朋友可以自行跟着我提供的思路分析剩下的几个API函数。

 

 

 

 

 

 

 

 

 

 

 

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐