openharmony安全子系统之证书管理(certificate_manager)源码分析
证书管理 证书管理主要提供系统级的证书管理能力,通过证书管理模块可以确保证书在传输和存储过程中的安全性,防止未经授权的访问和使用。当前提供了应用私有凭据的安装、获取、使用及卸载能力。通过证书管理能力,可以实现证书全生命周期(安装、存储、使用和销毁)的管理和安全使用。常见使用场景 安装应用私有凭据,获取应用私有凭据&
证书管理
证书管理主要提供系统级的证书管理能力,通过证书管理模块可以确保证书在传输和存储过程中的安全性,防止未经授权的访问和使用。当前提供了应用私有凭据的安装、获取、使用及卸载能力。通过证书管理能力,可以实现证书全生命周期(安装、存储、使用和销毁)的管理和安全使用。
常见使用场景
安装应用私有凭据,获取应用私有凭据,并使用应用私有凭据进行签名、验签,最后删除应用私有凭据。
证书管理概述
证书管理主要提供系统级的证书管理能力,实现证书全生命周期(安装、存储、使用和销毁)的管理和安全使用。
证书管理基本概念
证书:经证书授权中心(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函数。
更多推荐
所有评论(0)