目录

如何解决给HTTP请求添加本地的.cer证书问题

问题现象

如何实现给HTTP请求添加本地的root.cer证书?

背景知识

解决方案

目前可以使用如下方案:

import fs from '@ohos.file.fs';
import { http } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { common } from '@kit.AbilityKit';

@Entry
@Component
struct HttpRootCerPage {
  requestHttp(url: string): Promise<string> {
    let context = this.getUIContext()?.getHostContext() as common.Context;
    context.area = 0;
    const keyPem = context.resourceManager.getRawFileContentSync('_.cnfic.com.cn.pem');
    let filesDir: string = context.filesDir;
    let filePath = filesDir + "/testCer2.pem";
    let file = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
    fs.writeSync(file.fd, keyPem.buffer);
    fs.fsyncSync(file.fd);
    fs.closeSync(file);
    return new Promise(() => {
      let httpRequest = http.createHttp();
      httpRequest.request(url, {
        method: http.RequestMethod.GET,
        caPath: filePath,
        connectTimeout: 60000,
        readTimeout: 60000,
      }, (err: BusinessError, data) => {
        console.info(`1---- url: ${JSON.stringify(url)}`);
        if (!err) {
          // data.result为HTTP响应内容,可根据业务需要进行解析
          console.info(`1---- arrResult: ${JSON.stringify(data.result)}`);
          console.info(`1---- code: ${JSON.stringify(data.responseCode)}`);
          console.info(`1---- type: ${JSON.stringify(data.resultType)}`);
          console.info(`1---- header: ${JSON.stringify(data.header)}`);
          console.info(`1---- cookies: ${JSON.stringify(data.cookies)}`);
          console.info(`1 ---------------------------------------------`);
          httpRequest.destroy();
        } else {
          console.error(`1---- error: ${JSON.stringify(err)}`);
          console.info(`1 ---------------------------------------------`);
          httpRequest.destroy();
        }
      });
    });
  }

  build() {
    Column() {
      Button('testButton')
        .height(50)
        .width(80)
        .onClick(() => {
          this.requestHttp('url');
        })
    }.height('100%')
  }
}