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

#### 问题现象

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

#### 背景知识

*   .cer文件是一种常用的证书格式，用于在HarmonyOS和其他系统中配置签名信息。这种证书包含公钥和证书指纹（即证书的摘要信息），主要用于保障软件代码的完整性和发布者身份的真实性。
*   PEM（Privacy Enhanced Mail）证书是一种用于加密和解密数据的证书格式，广泛应用于HTTPS、SSH等安全协议中。PEM格式的证书包含公钥和签名，用于验证网站或其他实体的身份。这种证书是文本格式，以“-----BEGIN CERTIFICATE-----”开始，并以“-----END CERTIFICATE-----”结束。
    
    在HarmonyOS开发中，PEM证书也可能用于安全相关的配置，例如在配置HTTP请求时，如果需要进行证书验证，可以通过PEM格式的证书来实现。具体来说，开发者可以将PEM证书通过特定的命令上传到设备，并在代码中使用这些证书来进行加密或验证操作。
    

#### 解决方案

目前可以使用如下方案：

*   步骤一：将.cer文件转换为PEM格式，因为HTTP请求中支持的是PEM格式的证书。开发者可以使用以下命令进行格式转换：
    
    openssl x509 -inform der -in yourcertificate.cer -out yourcertificate.pem。
    
*   步骤二：在HTTP中使用：
    *   可以将证书放入根证书同级目录下如“/etc/ssl/certs/cacert1.pem”，将该路径设置到[caPath参数](https://developer.huawei.com/consumer/cn/doc/harmonyos-references/js-apis-http#httprequestoptions)。
        
        命令如下：
        
        hdc file send testCert.pem（PC上证书路径）/etc/ssl/certs/testCert.pem(证书默认沙箱路径)。
        
    *   从代码层面设置写入证书文件，首先将证书放入项目rawfile资源目录下，然后将代码生成写入的filePath参数设置到请求中caPath，关键代码如下：

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%')
  }
}