HarmonyOS 鸿蒙Next RSA和PEM证书加载公钥均失败,报错convertKey failed, 401, convert key fail
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”的问题,这通常指示密钥格式或内容有误,或者密钥处理逻辑存在问题。请检查以下几点:
- 确保PEM证书格式正确,包含正确的BEGIN/END标记(如
-----BEGIN PUBLIC KEY-----
)。 - 验证PEM内容是否完整且未损坏。
- 检查代码中加载和解析PEM证书的逻辑,确保使用了正确的API和参数。
如果问题依旧没法解决请加我微信,我的微信是itying888。