HarmonyOS 鸿蒙Next RSA和PEM证书加载公钥均失败,报错convertKey failed, 401, convert key fail

发布于 1周前 作者 bupafengyu 最后一次编辑是 5天前 来自 鸿蒙OS

HarmonyOS 鸿蒙Next RSA和PEM证书加载公钥均失败,报错convertKey failed, 401, convert key fail

【关键字】 RSA / PEM / X509CRL / 401 / convertKey / 加载公钥

【问题描述】 cryptoFramework.createAsyKeyGenerator(‘RSA1024|PRIMES_2’) 方式创建报错 convertKey failed, 401, convert key fail.

公钥没有问题,字符串转换 Uint8Array没有问题,转换 Base64Util.encodeSync没有问题。

关键代码如下:


static async convertAsyKey() {
let secretKey = SecretKeyManager.getInstance().getCurrentSecretKey();
let public1 = secretKey.getSecretPublicKey()

MyLog.error(“公钥Base64==”+public1)
let basedata= Base64Util.encodeSync(stringToUint8Array(public1))
MyLog.error(“公钥Byte==”+basedata.toString())


let rsaGenerator = cryptoFramework.createAsyKeyGenerator(‘RSA1024’);
let pkBlob: cryptoFramework.DataBlob = {data: basedata }
rsaGenerator.convertKey(pkBlob, null, (err, keyPair) => {
if (err) {
console.error(convertKey failed, ${err.code}, ${err.message});
return;
}
console.error(‘convertKey success’);
});

createX509Crl方式创建报错failed, errCode: 401, errMsg:create X509Crl failed

关键代码如下:


let textEncoder = new util.TextEncoder();
let encodingBlob: certFramework.EncodingBlob = {
// 将CRL数据从string转为Unit8Array
data:textEncoder.encodeInto(crlData222),
// CRL格式,仅支持PEM和DER格式。在这个例子中,CRL用的是PEM格式
encodingFormat: certFramework.EncodingFormat.FORMAT_PEM
};

// 创建X509CRL实例
certFramework.createX509CRL(encodingBlob, (err, x509Crl) => {
if (err != null) {
// 创建X509CRL实例失败
console.error(createX509Crl failed, errCode: ${err.code}, errMsg:${err.message});
return;
}
// 创建X509CRL实例成功console.error(‘createX509CRL success’);

【解决方案】 如果公钥是base64编码的,直接使用decodeSync方法得到解码后对应的Uint8Array对象。

参考Demo如下:


//RSA公钥字符串(base64编码)
let pubKeyStr = ‘M******SqGSIb3DQEBAQUAA4GNADCBiQKBgQCYGI4NquxHShzlBM1ymQ3FSye3Xc/Sn62EQUgxxTZoBqScEDPeLmQQqmJ0SRaFeSItvw5oRh3EWYddVJZtZnxh287XirmeJiDrhtCEH/EILJF7dZcUpi5groCyRADOaDiLP6Ed+h2VcrVgq1uBm7P5t8HS6fqWCRdCNLLA/9j2FwIDAQAB’

// 初始化Base64工具实例
let base64Helper = new util.Base64Helper();
// 公钥转换为Uint8Array,然后包装为DataBlob类型
let pubKeyBlob: cryptoFramework.DataBlob = { data: base64Helper.decodeSync(pubKeyStr) };
// 创建RSA key生成器
let rsaGenerator = cryptoFramework.createAsyKeyGenerator(‘RSA1024’);
// 将公钥包装数据pubKeyBlob转换成密钥对类型KeyPairlet keyPair = await rsaGenerator.convertKey(pubKeyBlob, null);
1 回复

针对HarmonyOS(鸿蒙)中RSA和PEM证书加载公钥失败,报错“convertKey failed, 401, convert key fail”的问题,这通常指示密钥格式或内容有误,或者密钥处理逻辑存在问题。请检查以下几点:

  1. 确保PEM证书格式正确,包含正确的BEGIN/END标记(如-----BEGIN PUBLIC KEY-----)。
  2. 验证PEM内容是否完整且未损坏。
  3. 检查代码中加载和解析PEM证书的逻辑,确保使用了正确的API和参数。

如果问题依旧没法解决请加我微信,我的微信是itying888。

回到顶部