HarmonyOS Developer 开发指导
用户认证开发概述
用户认证模块的定义
用户认证模块提供用户认证能力,对应用开发者而言,可使用该模块进行用户身份认证,用于设备解锁、支付、应用登录等身份认证场景。
当前用户认证提供人脸识别和指纹识别能力,设备具备哪种识别能力,取决于当前设备的硬件能力和技术实现。
基本概念
- 人脸识别:基于人的脸部特征信息进行身份识别的一种生物特征识别技术,用摄像机或摄像头采集含有人脸的图像或视频流,并自动在图像中检测和跟踪人脸,进而对检测到的人脸进行脸部识别,通常也叫做人像识别、面部识别、人脸认证。
- 指纹识别:基于人的指尖皮肤纹路进行身份识别的一种生物特征识别技术。当用户触摸指纹采集器件时,器件感知并获取到用户的指纹图像,然后传输到指纹识别模块进行一定的处理后与用户预先注册的指纹信息进行比对,从而识别出用户身份。
运作机制
人脸或指纹识别过程中,特征采集器件和TEE(Trusted Execution Environment)之间会建立安全通道,将采集的生物特征信息直接通过安全通道传递到TEE中,从而避免了恶意软件从REE(Rich Execution Environment)侧进行攻击。传输到TEE中的生物特征数据从活体检测、特征提取、特征存储、特征比对到特征销毁等处理都完全在TEE中完成,基于TrustZone进行安全隔离,提供API的服务框架只负责管理认证请求和处理认证结果等数据,不涉及生物特征数据本身。
用户注册的生物特征数据在TEE的安全存储区进行存储,采用高强度的密码算法进行加密和完整性保护,外部无法获取到加密生物特征数据的密钥,保证了用户生物特征数据的安全性。本能力采集和存储的生物特征数据不会在用户未授权的情况下被传出TEE。这意味着,用户未授权时,无论是系统应用还是三方应用都无法获得人脸和指纹等特征数据,也无法将这些特征数据传送或备份到任何外部存储介质。
约束与限制
- 当前版本提供的用户认证能力包含人脸识别和指纹识别,且只支持本地认证,不提供认证界面。
- 要求设备上具备相应的生物特征采集器,且对于人脸识别要求人脸图像分辨率大于100*100。
- 要求设备上具有TEE安全环境,人脸和指纹等生物特征信息高强度加密保存在TEE中。
- 对于面部特征相似的人、面部特征不断发育的儿童,人脸特征匹配率有所不同。如果对此担忧,可考虑其他认证方式。
- 本模块接口不支持在x86模拟器上运行,请使用真机设备或其他模拟器运行。
用户认证开发指导
说明
该开发指导需配合API version 9版本的SDK使用。
场景介绍
当前用户认证支持人脸识别和指纹识别,可应用于设备解锁、应用登录、支付等身份认证场景。
接口说明
userIAM_userAuth模块提供了用户认证的相关方法,包括查询认证能力、发起认证和取消认证等,用户可以使用人脸、指纹等生物特征信息进行认证操作。具体接口说明可以查阅API参考文档。
在执行认证前,需要指定认证类型和认证等级,查询设备是否支持该认证能力。
表1 用户认证开放能力列表
接口名称 | 功能描述 |
getVersion() : number | 获取认证对象的版本信息。 |
getAvailableStatus(authType : UserAuthType, authTrustLevel : AuthTrustLevel): void | 根据指定的认证类型、认证等级,检测当前设备是否支持相应的认证能力。 |
getAuthInstance(challenge : Uint8Array, authType : UserAuthType, authTrustLevel : AuthTrustLevel): AuthInstance | 获取AuthInstance对象,用于执行用户身份认证。 |
on(name : AuthEventKey, callback : AuthEvent) : void | 订阅指定类型的用户认证事件。 |
off(name : AuthEventKey) : void | 取消订阅特定类型的认证事件。 |
start: void | 执行用户认证。 |
cancel: void | 取消本次认证操作。 |
获取认证对象的版本信息
开发步骤
- 申请权限。调用getVersion接口,需要在module.json5文件的requestPermissions对象中配置ohos.permission.ACCESS_BIOMETRIC权限。更多配置信息请参考Stage模型应用程序包结构。
- 调用getVersion接口获取版本信息。
import userIAM_userAuth from '@ohos.userIAM.userAuth';
// 获取版本信息
try {
let version = userIAM_userAuth.getVersion();
console.info("auth version = " + version);
} catch (error) {
console.info("get version failed, error = " + error);
}
查询当前设备是否支持相应的认证能力
开发步骤
- 申请权限。调用getAvailableStatus接口,需要在module.json5文件的requestPermissions对象中配置ohos.permission.ACCESS_BIOMETRIC权限。更多配置信息请参考Stage模型应用程序包结构。
- 指定认证类型和认证等级,调用getAvailableStatus接口查询当前的设备是否支持相应的认证能力。
import userIAM_userAuth from '@ohos.userIAM.userAuth';
// 查询认证能力是否支持
try {
userIAM_userAuth.getAvailableStatus(userIAM_userAuth.UserAuthType.FACE, userIAM_userAuth.AuthTrustLevel.ATL1);
console.info("current auth trust level is supported");
} catch (error) {
console.info("current auth trust level is not supported, error = " + error);
}
执行认证操作并请阅认证结果
开发步骤
- 申请权限。调用start接口,需要在module.json5文件的requestPermissions对象中配置ohos.permission.ACCESS_BIOMETRIC权限。更多配置信息请参考Stage模型应用程序包结构。
- 指定challenge、认证类型和认证等级,获取认证对象。
- 调用on接口订阅认证结果。
- 调用start接口发起认证,通过callback回调返回认证结果。
- 调用off接口取消订阅认证结果。
import userIAM_userAuth from '@ohos.userIAM.userAuth';
let challenge = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
let authType = userIAM_userAuth.UserAuthType.FACE;
let authTrustLevel = userIAM_userAuth.AuthTrustLevel.ATL1;
// 获取认证对象
let auth;
try {
auth = userIAM_userAuth.getAuthInstance(challenge, authType, authTrustLevel);
console.log("get auth instance success");
} catch (error) {
console.log("get auth instance failed" + error);
}
// 订阅认证结果
try {
auth.on("result", {
callback: (result: userIAM_userAuth.AuthResultInfo) => {
console.log("authV9 result " + result.result);
console.log("authV9 token " + result.token);
console.log("authV9 remainAttempts " + result.remainAttempts);
console.log("authV9 lockoutDuration " + result.lockoutDuration);
}
});
console.log("subscribe authentication event success");
} catch (error) {
console.log("subscribe authentication event failed " + error);
}
// 开始认证
try {
auth.start();
console.info("authV9 start auth success");
} catch (error) {
console.info("authV9 start auth failed, error = " + error);
}
// 取消订阅认证结果
try {
auth.off("result");
console.info("cancel subscribe authentication event success");
} catch (error) {
console.info("cancel subscribe authentication event failed, error = " + error);
}
执行认证操作并订阅认证过程中的提示信息
开发步骤
- 申请权限。调用start接口,需要在module.json5文件的requestPermissions对象中配置ohos.permission.ACCESS_BIOMETRIC权限。更多配置信息请参考Stage模型应用程序包结构。
- 指定challenge、认证类型和认证等级,获取认证对象。
- 调用on接口订阅认证过程中的提示信息。
- 调用start接口发起认证,通过callback回调返回认证过程中的提示信息。
- 调用off接口取消订阅认证过程中的提示信息。
import userIAM_userAuth from '@ohos.userIAM.userAuth';
let challenge = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
let authType = userIAM_userAuth.UserAuthType.FACE;
let authTrustLevel = userIAM_userAuth.AuthTrustLevel.ATL1;
// 获取认证对象
let auth;
try {
auth = userIAM_userAuth.getAuthInstance(challenge, authType, authTrustLevel);
console.log("get auth instance success");
} catch (error) {
console.log("get auth instance failed" + error);
}
// 订阅认证过程中的提示信息
try {
auth.on("tip", {
callback : (result : userIAM_userAuth.TipInfo) => {
switch (result.tip) {
case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_BRIGHT:
// do something;
case userIAM_userAuth.FaceTips.FACE_AUTH_TIP_TOO_DARK:
// do something;
default:
// do others
}
}
});
console.log("subscribe authentication event success");
} catch (error) {
console.log("subscribe authentication event failed " + error);
}
// 开始认证
try {
auth.start();
console.info("authV9 start auth success");
} catch (error) {
console.info("authV9 start auth failed, error = " + error);
}
// 取消订阅认证过程中的提示信息
try {
auth.off("tip");
console.info("cancel subscribe tip information success");
} catch (error) {
console.info("cancel subscribe tip information failed, error = " + error);
}
认证过程中取消认证
开发步骤
- 申请权限。调用cancel接口,需要在module.json5文件的requestPermissions对象中配置ohos.permission.ACCESS_BIOMETRIC权限。更多配置信息请参考Stage模型应用程序包结构。
- 指定challenge、认证类型和认证等级,获取认证对象。
- 调用start接口发起认证。
- 通过调用cancel接口取消本次认证。
import userIAM_userAuth from '@ohos.userIAM.userAuth';
let challenge = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
let authType = userIAM_userAuth.UserAuthType.FACE;
let authTrustLevel = userIAM_userAuth.AuthTrustLevel.ATL1;
// 获取认证对象
let auth;
try {
auth = userIAM_userAuth.getAuthInstance(challenge, authType, authTrustLevel);
console.log("get auth instance success");
} catch (error) {
console.log("get auth instance failed" + error);
}
// 开始认证
try {
auth.start();
console.info("authV9 start auth success");
} catch (error) {
console.info("authV9 start auth failed, error = " + error);
}
// 取消认证
try {
auth.cancel();
console.info("cancel auth success");
} catch (error) {
console.info("cancel auth failed, error = " + error);
}
证书概述
提供X509证书相关的功能。开发者可以通过调用该系统能力,实现迅捷开发。
证书基本概念
数字证书提供了一种数字验证用户、设备、业务身份的方式。X509证书是国际定制的标准格式。加解密算法库框架部件提供X509证书、X509证书吊销列表、证书链校验器相关的功能。
- X509证书:提供X509证书的解析、序列化、X509证书签名验证、证书相关的信息查询等功能
- X509证书吊销列表:提供X509证书吊销列表的解析、序列化、信息查询等功能
- 证书链校验器:提供证书链校验(不包括证书有效期的校验)、证书链算法名称查询的功能
约束与限制
- 不支持多线程并发操作。
证书规格
- 证书链校验
由于端侧系统时间不可信,证书链校验不包含对证书有效时间的校验。如果需要检查证书的时间有效性,可使用X509证书的checkValidityWithDate()方法进行检查。 - 证书格式
目前支持DER与PEM格式的证书。
证书开发指导
说明
本开发指导基于API version 9,适用于JS语言开发
使用证书操作
场景说明
使用证书操作中,典型的场景有:
- 解析X509证书数据生成证书对象。
- 获取证书信息,比如:证书版本、证书序列号等。
- 获取证书对象的序列化数据。
- 获取证书公钥。
- 证书验签。
- 校验证书有效期。
接口及参数说明
详细接口说明可参考API参考。
以上场景涉及的常用接口如下表所示:
实例名 | 接口名 | 描述 |
cryptoCert | createX509Cert(inStream : EncodingBlob, callback : AsyncCallback<X509Cert>) : void | 使用callback方式解析X509证书数据生成证书对象 |
cryptoCert | createX509Cert(inStream : EncodingBlob) : Promise<X509Cert> | 使用promise方式解析X509证书数据生成证书对象 |
X509Cert | verify(key : cryptoFramework.PubKey, callback : AsyncCallback<void>) : void | 使用callback方式进行证书验签 |
X509Cert | verify(key : cryptoFramework.PubKey) : Promise<void> | 使用promise方式进行证书验签 |
X509Cert | getEncoded(callback : AsyncCallback<EncodingBlob>) : void | 使用callback方式获取证书序列化数据 |
X509Cert | getEncoded() : Promise<EncodingBlob> | 使用promise方式获取证书序列化数据 |
X509Cert | getPublicKey() : cryptoFramework.PubKey | 获取证书公钥 |
X509Cert | checkValidityWithDate(date: string) : void | 校验证书有效期 |
X509Cert | getVersion() : number | 获取证书版本 |
X509Cert | getSerialNumber() : number | 获取证书序列号 |
X509Cert | getIssuerName() : DataBlob | 获取证书颁发者名称 |
X509Cert | getSubjectName() : DataBlob | 获取证书主体名称 |
X509Cert | getNotBeforeTime() : string | 获取证书有效期起始时间 |
X509Cert | getNotAfterTime() : string | 获取证书有效期截至时间 |
X509Cert | getSignature() : DataBlob | 获取证书签名 |
X509Cert | getSignatureAlgName() : string | 获取证书签名算法名称 |
X509Cert | getSignatureAlgOid() : string | 获取证书签名算法OID |
X509Cert | getSignatureAlgParams() : DataBlob | 获取证书签名算法参数 |
X509Cert | getKeyUsage() : DataBlob | 获取证书秘钥用途 |
X509Cert | getExtKeyUsage() : DataArray | 获取证书扩展秘钥用途 |
X509Cert | getBasicConstraints() : number | 获取证书基本约束 |
X509Cert | getSubjectAltNames() : DataArray | 获取证书主体可选名称 |
X509Cert | getIssuerAltNames() : DataArray | 获取证书颁发者可选名称 |
开发步骤
示例:解析X509证书数据生成证书对象,并调用对象方法(包含场景1-6)
import cryptoCert from '@ohos.security.cert';
import cryptoFramework from '@ohos.security.cryptoFramework';
// 证书数据,此处仅示例,业务需根据场景自行设置
let certData = "-----BEGIN CERTIFICATE-----\n"
+ "IBzTCCAXCgAwIBAgIGAXKnMKNyMAwGCCqBHM9VAYN1BQAwSTELMAkGA1UEBhMC\n"
+ "04xDjAMBgNVBAoTBUdNU1NMMRAwDgYDVQQLEwdQS0kvU00yMRgwFgYDVQQDEw9S\n"
+ "290Q0EgZm9yIFRlc3QwIhgPMjAxNTEyMzExNjAwMDBaGA8yMDM1MTIzMDE2MDAw\n"
+ "FowSTELMAkGA1UEBhMCQ04xDjAMBgNVBAoTBUdNU1NMMRAwDgYDVQQLEwdQS0kv\n"
+ "00yMRgwFgYDVQQDEw9Sb290Q0EgZm9yIFRlc3QwWTATBgcqhkjOPQIBBggqgRzP\n"
+ "QGCLQNCAATj+apYlL+ddWXZ7+mFZXZJGbcJFXUN+Fszz6humeyWZP4qEEr2N0+a\n"
+ "dwo/21ft232yo0jPLzdscKB261zSQXSoz4wPDAZBgNVHQ4EEgQQnGnsD7oaOcWv\n"
+ "CTrspwSBDAPBgNVHRMBAf8EBTADAQH/MA4GA1UdDwEB/wQEAwIAxjAMBggqgRzP\n"
+ "QGDdQUAA0kAMEYCIQCEnW5BlQh0vmsOLxSoXYc/7zs++wWyFc1tnBHENR4ElwIh\n"
+ "I1Lwu6in1ruflZhzseWulXwcITf3bm/Y5X1g1XFWQUH\n"
+ "-----END CERTIFICATE-----\n";
// string转Uint8Array
function stringToUint8Array(str) {
var arr = [];
for (var i = 0, j = str.length; i < j; i++) {
arr.push(str.charCodeAt(i));
}
return new Uint8Array(arr);
}
// 证书示例
function certSample() {
let encodingBlob = {
// 将string类型证书数据转为Uint8Array
data: stringToUint8Array(certData),
// 证书格式:支持PEM和DER,此例中对应PEM
encodingFormat: cryptoCert.EncodingFormat.FORMAT_PEM
};
// 创建证书对象
cryptoCert.createX509Cert(encodingBlob, function (err, x509Cert) {
if (err != null) {
// 创建证书对象失败
console.log("createX509Cert failed, errCode: " + err.code + ", errMsg: " + err.message);
return;
}
// 创建证书对象成功
console.log("createX509Cert success");
// 获取证书版本
let version = x509Cert.getVersion();
// 获取证书对象的序列化数据
x509Cert.getEncoded(function (err, data) {
if (err != null) {
// 获取序列化数据失败
console.log("getEncoded failed, errCode: " + err.code + ", errMsg: " + err.message);
} else {
// 获取序列化数据成功
console.log("getEncoded success");
}
});
// 业务需通过上级证书对象或本证书对象(自签名)的getPublicKey接口获取公钥对象,此处省略
let pubKey = null;
try {
pubKey = x509Cert.getPublicKey();
} catch (error) {
console.log("getPublicKey failed, errCode: " + error.code + ", errMsg: " + error.message);
}
// 证书验签
x509Cert.verify(pubKey, function (err, data) {
if (err == null) {
// 验签成功
console.log("verify success");
} else {
// 验签失败
console.log("verify failed, errCode: " + err.code + ", errMsg: " + err.message);
}
});
// 时间字符串
let date = "150527000001Z";
// 校验证书有效期
try {
x509Cert.checkValidityWithDate(date);
} catch (error) {
console.log("checkValidityWithDate failed, errCode: " + error.code + ", errMsg: " + error.message);
}
});
}
使用证书吊销列表操作
场景说明
使用证书吊销列表操作中,典型的场景有:
- 解析X509证书吊销列表数据生成吊销列表对象。
- 获取证书吊销列表信息,比如:证书吊销列表版本、证书吊销列表类型等。
- 获取证书吊销列表对象的序列化数据。
- 检查证书是否被吊销。
- 证书吊销列表验签。
- 获取被吊销证书。
接口及参数说明
详细接口说明可参考API参考。
以上场景涉及的常用接口如下表所示:
实例名 | 接口名 | 描述 |
cryptoCert | createX509Crl(inStream : EncodingBlob, callback : AsyncCallback<X509Crl>) : void | 使用callback方式解析X509证书吊销列表数据生成证书吊销列表对象 |
cryptoCert | createX509Crl(inStream : EncodingBlob) : Promise<X509Crl> | 使用promise方式解析X509证书吊销列表数据生成证书吊销列表对象 |
X509Crl | isRevoked(cert : X509Cert) : boolean | 检查证书是否被吊销 |
X509Crl | getType() : string | 获取证书吊销列表类型 |
X509Crl | getEncoded(callback : AsyncCallback<EncodingBlob>) : void | 使用callback方式获取证书吊销列表序列化数据 |
X509Crl | getEncoded() : Promise<EncodingBlob> | 使用promise方式获取证书吊销列表序列化数据 |
X509Crl | verify(key : cryptoFramework.PubKey, callback : AsyncCallback<void>) : void | 使用callback方式进行证书吊销列表验签 |
X509Crl | verify(key : cryptoFramework.PubKey) : Promise<void> | 使用Promise方式进行证书吊销列表验签 |
X509Crl | getVersion() : number | 获取证书吊销列表版本 |
X509Crl | getIssuerName() : DataBlob | 获取证书吊销列表颁发者名称 |
X509Crl | getLastUpdate() : string | 获取证书吊销列表lastUpdate日期 |
X509Crl | getNextUpdate() : string | 获取证书吊销列表nextUpdate日期 |
X509Crl | getRevokedCert(serialNumber : number) : X509CrlEntry | 通过序列号获取证书吊销列表中的被吊销证书 |
X509Crl | getRevokedCertWithCert(cert : X509Cert) : X509CrlEntry | 通过X509证书获取证书吊销列表中的被吊销证书 |
X509Crl | getRevokedCerts(callback : AsyncCallback<Array<X509CrlEntry>>) : void | 使用callback方式获取证书吊销列表的所有被吊销证书 |
X509Crl | getRevokedCerts() : Promise<Array<X509CrlEntry>> | 使用Promise方式获取证书吊销列表的所有被吊销证书 |
X509Crl | getTbsInfo() : DataBlob | 获取证书吊销列表的tbsCertList |
X509Crl | getSignature() : DataBlob | 获取证书吊销列表的签名 |
X509Crl | getSignatureAlgName() : string | 获取证书吊销列表的签名算法名称 |
X509Crl | getSignatureAlgOid() : string | 获取证书吊销列表的签名算法OID |
X509Crl | getSignatureAlgParams() : DataBlob | 获取证书吊销列表的签名算法参数 |
开发步骤
示例:解析X509证书吊销列表数据生成证书吊销列表对象,并调用对象方法(包含场景1-6)
import cryptoCert from '@ohos.security.cert';
import cryptoFramework from '@ohos.security.cryptoFramework';
// 证书吊销列表数据,此处仅示例,业务需根据场景自行设置
let crlData = "-----BEGIN X509 CRL-----\n"
+ "MIIBijB0AgEBMA0GCSqGSIb3DQEBCwUAMBMxETAPBgNVBAMMCHJvb3QtY2ExFw0y\n"
+ "MDA2MTkxNjE1NDhaFw0yMDA3MTkxNjE1NDhaMBwwGgIJAMsozRATnap1Fw0yMDA2\n"
+ "MTkxNjEyMDdaoA8wDTALBgNVHRQEBAICEAIwDQYJKoZIhvcNAQELBQADggEBACPs\n"
+ "9gQB+djaXPHHRmAItebZpD3iJ/e36Dxr6aMVkn9FkI8OVpUI4RNcCrywyCZHQJte\n"
+ "995bbPjP7f1sZstOTZS0fDPgJ5SPAxkKOQB+SQnBFrlZSsxoUNU60gRqd2imR0Rn\n"
+ "1r09rP69F6E4yPc9biEld+llLGgoImP3zPOVDD6fbfcvVkjStY3bssVEQ/vjp4a3\n"
+ "/I12U7ZnSe3jaKqaQBoVJppkTFOIOq7IOxf5/IkMPmvRHDeC2IzDMzcUxym0dkny\n"
+ "EowHrjzo0bZVqpHMA2YgKZuwTpVLHk9GeBEK2hVkIoPVISkmiU4HFg0S6z68C5yd\n"
+ "DrAA7hErVgXhtURLbAI=\n"
+ "-----END X509 CRL-----\n";
// string转Uint8Array
function stringToUint8Array(str) {
var arr = [];
for (var i = 0, j = str.length; i < j; i++) {
arr.push(str.charCodeAt(i));
}
return new Uint8Array(arr);
}
// 证书吊销列表示例
function crlSample() {
let encodingBlob = {
// 将string类型证书吊销列表数据转为Uint8Array
data: stringToUint8Array(crlData),
// 证书吊销列表格式:支持PEM和DER,此例中对应PEM
encodingFormat: cryptoCert.EncodingFormat.FORMAT_PEM
};
// 创建证书吊销列表对象
cryptoCert.createX509Crl(encodingBlob, function (err, x509Crl) {
if (err != null) {
// 创建证书吊销列表对象失败
console.log("createX509Crl failed, errCode: " + err.code + ", errMsg: " + err.message);
return;
}
// 创建证书吊销列表对象成功
console.log("createX509Crl success");
// 获取证书吊销列表版本
let version = x509Crl.getVersion();
// 获取证书吊销列表对象的序列化数据
x509Crl.getEncoded(function (err, data) {
if (err != null) {
// 获取序列化数据失败
console.log("getEncoded failed, errCode: " + err.code + ", errMsg: " + err.message);
} else {
// 获取序列化数据成功
console.log("getEncoded success");
}
});
// 业务需通过cryptoFramework的createX509Cert生成X509Cert证书对象,此处省略
let x509Cert = null;
// 检查证书是否被吊销
try {
let revokedFlag = x509Crl.isRevoked(x509Cert);
} catch (error) {
console.log("isRevoked failed, errCode: " + error.code + ", errMsg: " + error.message);
}
// 业务需通过AsyKeyGenerator的generateKeyPair或convertKey接口获取PubKey对象,此处省略
let pubKey = null;
// 证书吊销列表验签
x509Crl.verify(pubKey, function (err, data) {
if (err == null) {
// 验签成功
console.log("verify success");
} else {
// 验签失败
console.log("verify failed, errCode: " + err.code + ", errMsg: " + err.message);
}
});
// 证书序列号,业务需自行设置
let serialNumber = 1000;
// 获取被吊销证书对象
try {
let entry = x509Crl.getRevokedCert(serialNumber);
} catch (error) {
console.log("getRevokedCert failed, errCode: " + error.code + ", errMsg: " + error.message);
}
});
}
使用证书链校验器操作
场景说明
使用证书链校验器操作中,典型的场景:证书链校验。
接口及参数说明
详细接口说明可参考API参考。
以上场景涉及的常用接口如下表所示:
实例名 | 接口名 | 描述 |
cryptoCert | createCertChainValidator(algorithm :string) : CertChainValidator | 使用指定算法生成证书链校验器对象 |
CertChainValidator | validate(certChain : CertChainData, callback : AsyncCallback<void>) : void | 使用callback方式校验证书链 |
CertChainValidator | validate(certChain : CertChainData) : Promise<void> | 使用promise方式校验证书链 |
CertChainValidator | algorithm : string | 证书链校验器算法名称 |
开发步骤
示例:创建证书链校验器对象,并对证书链数据进行校验(场景1)
import cryptoCert from '@ohos.security.cert';
// 一级证书数据,此处仅示例,业务需自行设置真实数据
let caCertData = "-----BEGIN CERTIFICATE-----\n"
+ "...\n"
+ "...\n"
+ "...\n"
+ "-----END CERTIFICATE-----\n";
// 二级证书数据,此处仅示例,业务需自行设置真实数据
let secondCaCertData = "-----BEGIN CERTIFICATE-----\n"
+ "...\n"
+ "...\n"
+ "...\n"
+ "-----END CERTIFICATE-----\n";
// string转Uint8Array
function stringToUint8Array(str) {
var arr = [];
for (var i = 0, j = str.length; i < j; i++) {
arr.push(str.charCodeAt(i));
}
return new Uint8Array(arr);
}
// 证书链校验器示例:此示例中以校验二级证书链为例,业务需根据场景自行修改
function certChainValidatorSample() {
// 证书链校验器算法,当前仅支持PKIX
let algorithm = "PKIX";
// 创建证书链校验器对象
let validator = cryptoCert.createCertChainValidator(algorithm);
// 一级证书数据
let uint8ArrayOfCaCertData = stringToUint8Array(caCertData);
// 一级证书数据长度
let uint8ArrayOfCaCertDataLen = new Uint8Array(new Uint16Array([uint8ArrayOfCaCertData.byteLength]).buffer);
// 二级证书数据
let uint8ArrayOf2ndCaCertData = stringToUint8Array(secondCaCertData);
// 二级证书数据长度
let uint8ArrayOf2ndCaCertDataLen = new Uint8Array(new Uint16Array([uint8ArrayOf2ndCaCertData.byteLength]).buffer);
// 证书链二进制数据:二级证书数据长度+二级证书数据+一级证书数据长度+一级证书数据(L-V格式)
let encodingData = new Uint8Array(uint8ArrayOf2ndCaCertDataLen.length + uint8ArrayOf2ndCaCertData.length +
uint8ArrayOfCaCertDataLen.length + uint8ArrayOfCaCertData.length);
for (var i = 0; i < uint8ArrayOf2ndCaCertDataLen.length; i++) {
encodingData[i] = uint8ArrayOf2ndCaCertDataLen[i];
}
for (var i = 0; i < uint8ArrayOf2ndCaCertData.length; i++) {
encodingData[uint8ArrayOf2ndCaCertDataLen.length + i] = uint8ArrayOf2ndCaCertData[i];
}
for (var i = 0; i < uint8ArrayOfCaCertDataLen.length; i++) {
encodingData[uint8ArrayOf2ndCaCertDataLen.length + uint8ArrayOf2ndCaCertData.length + i] = uint8ArrayOfCaCertDataLen[i];
}
for (var i = 0; i < uint8ArrayOfCaCertData.length; i++) {
encodingData[uint8ArrayOf2ndCaCertDataLen.length + uint8ArrayOf2ndCaCertData.length +
uint8ArrayOfCaCertDataLen.length + i] = uint8ArrayOfCaCertData[i];
}
let certChainData = {
// Uint8Array类型:L-V格式(证书数据长度-证书数据)
data: encodingData,
// 证书数量,此示例中为2
count: 2,
// 证书格式:支持PEM和DER,此例中对应PEM
encodingFormat: cryptoCert.EncodingFormat.FORMAT_PEM
};
// 校验证书链
validator.validate(certChainData, function (err, data) {
if (err != null) {
// 证书链校验失败
console.log("validate failed, errCode: " + err.code + ", errMsg: " + err.message);
} else {
// 证书链校验成功
console.log("validate success");
}
});
}
使用被吊销证书操作
场景说明
使用被吊销证书操作中,典型的场景有:
- 获取被吊销证书对象。
- 获取被吊销证书信息,比如:序列号、证书颁发者、证书吊销日期。
- 获取被吊销证书对象的序列化数据。
接口及参数说明
详细接口说明可参考API参考。
以上场景涉及的常用接口如下表所示:
实例名 | 接口名 | 描述 |
X509CrlEntry | getEncoded(callback : AsyncCallback<EncodingBlob>) : void; | 使用callback方式获取被吊销证书的序列化数据 |
X509CrlEntry | getEncoded() : Promise<EncodingBlob>; | 使用promise方式获取被吊销证书的序列化数据 |
X509CrlEntry | getSerialNumber() : number; | 获取被吊销证书的序列号 |
X509CrlEntry | getCertIssuer() : DataBlob; | 获取被吊销证书颁发者 |
X509CrlEntry | getRevocationDate() : string; | 获取被吊销证书的吊销日期 |
开发步骤
示例:获取被吊销证书对象,并调用对象方法(包含场景1-3)
import cryptoCert from '@ohos.security.cert';
// 被吊销证书示例
function crlEntrySample() {
// 业务需自行通过cryptoFramework的createX509Crl接口创建X509Crl对象,此处省略
let x509Crl = null;
// 获取被吊销证书对象,业务需根据场景调用X509Crl的接口获取,此示例使用getRevokedCert获取
let serialNumber = 1000;
let crlEntry = null;
try {
crlEntry = x509Crl.getRevokedCert(serialNumber);
} catch (error) {
console.log("getRevokedCert failed, errCode: " + error.code + ", errMsg: " + error.message);
}
// 获取被吊销证书的序列号
serialNumber = crlEntry.getSerialNumber();
// 获取被吊销证书的吊销日期
try {
crlEntry.getRevocationDate();
} catch (error) {
console.log("getRevocationDate failed, errCode: " + error.code + ", errMsg: " + error.message);
}
// 获取被吊销证书对象的序列化数据
crlEntry.getEncoded(function (err, data) {
if (err != null) {
// 获取序列化数据失败
console.log("getEncoded failed, errCode: " + err.code + ", errMsg: " + err.message);
} else {
// 获取序列化数据成功
console.log("getEncoded success");
}
});
}