【关键字】
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);