1、读取证书dck.crt,再通过x509Cert.getPublicKey获取证书内容,转换成string格式
startTLSNetConnect() {
this.context.resourceManager.getRawFileContent("dck.crt").then((value: Uint8Array) => {
let encodingBlob: cert.EncodingBlob = {
data: value,
// 根据encodingData的格式进行赋值,支持FORMAT_PEM和FORMAT_DER
encodingFormat: cert.EncodingFormat.FORMAT_PEM
};
cert.createX509Cert(encodingBlob, (error, x509Cert) => {
if (error) {
console.error('createX509Cert failed, errCode: ' + error.code + ', errMsg: ' + error.message);
} else {
console.log('createX509Cert success');
try {
let pubKey = x509Cert.getPublicKey();
let base64 = new util.Base64Helper();
let pubKeyContent = base64.encodeToStringSync(pubKey.getEncoded().data)
TLSNetWorkManager.getInstance().registerAction(pubKeyContent)
} catch (error) {
let e: BusinessError = error as BusinessError;
console.error('getPublicKey failed, errCode: ' + e.code + ', errMsg: ' + e.message);
}
}
})
})
}
2、将转换成string格式的证书内容传入rcp,执行后报错
async registerAction(content: string){
console.log("请求开始")
const session = rcp.createSession();
const HOST = "https://dck.gdota.club:2626/appsvr/registerSdk"
try {
const request = new rcp.Request(HOST, 'POST');
request.headers = {
'Content-Type': 'application/json'
}
request.content = `{"cywallid":"harmonyos3-f42f-4585-9bdb-69a99d6aa0e5","pubkey":"123456","token":"token-owner-01"}`
request.configuration = {
tracing: {
infoToCollect: {
textual: true
}
},
security: {
tlsOptions: tlsOption,
certificate:{
content:content,
type: 'PEM',
key: 'pubkey',
keyPassword: '123456'
}
}
};
const resp = await session.fetch(request);
console.log(`resp:${resp}`)
} catch (error) {
console.error(`Rcp err: Code is ${error.code}, message is ${error.data}`);
session.close();
}
}
3、报错信息 Rcp err: Code is 1007900058, message is Problem with the local SSL certificate
对于crt格式的证书文件,rcp请求中除了传入content证书内容,还需要传入key字段即证书对应的密钥文件地址如key: “/path/dir/”,请传入必要字段后再次尝试。
可参考以下示例调用saveFile函数把raw路径下的文件发到手机相关路径下,再配置key: filesDir + ‘/client.key’:
完整的demo示例请参考如下代码: