自学内容网 自学内容网

【HarmonyOS NEXT】鸿蒙https请求跳过证书校验

https请求前,进行自签名证书加载

1.运行报错: error:{"code":2300060,"message":"SSL peer certificate or SSH remote key was not OK"},显示无法校验服务器身份,
2. 导致这个错误码的原因可能有以下几种:

服务器证书过期或者未被信任:如果服务器证书过期或者未被信任,客户端将无法验证证书的有效性,从而导致CURLE_PEER_FAILED_VERIFICATION错误。
服务器证书链不完整:如果服务器证书链不完整,客户端将无法验证证书的有效性,从而导致CURLE_PEER_FAILED_VERIFICATION错误。
客户端时间与服务器时间不一致:如果客户端的系统时间与服务器的时间不一致,客户端将无法验证证书的有效性,从而导致CURLE_PEER_FAILED_VERIFICATION错误。
针对这些问题,可以采取以下措施:
更新服务器证书:如果服务器证书过期或者未被信任,需要更新服务器证书。
完整的证书链:确保服务器证书链完整,包括中间证书。
同步客户端和服务器时间:确保客户端和服务器时间同步。
3、可将自签名证书放在项目rawfile文件目录下,通过demo写入工程机系统,在请求时设置capath参数指定证书写入的沙箱路径进,看是否可请求到结果

应用自己的沙箱路径
/data/app/el2/100/base/{包名}/haps/entry/files

https请求跳过证书校验方法:

将p12转换成pem尝试,p12转换pem可参考如下命令

## 生成时如果p12证书有密码,需要输入密码

## 生成 key文件命令
openssl pkcs12 -in client.p12 -out key.pem -nocerts -nodes
## 生成 证书文件命令
openssl pkcs12 -in client.p12 -out crt.pem -clcerts -nokeys

示例代码

// 引入包名
import { http } from '@kit.NetworkKit';
import { BusinessError } from '@kit.BasicServicesKit';

// 每一个httpRequest对应一个HTTP请求任务,不可复用
let httpRequest = http.createHttp();
// 用于订阅HTTP响应头,此接口会比request请求先返回。可以根据业务需要订阅此消息
// 从API 8开始,使用on('headersReceive', Callback)替代on('headerReceive', AsyncCallback)。 8+
httpRequest.on('headersReceive', (header: Object) => {
  console.info('header: ' + JSON.stringify(header));
});

class Header {
  public contentType: string;

  constructor(contentType: string) {
    this.contentType = contentType;
  }
}

httpRequest.request(// 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定
  "EXAMPLE_URL",
  {
    method: http.RequestMethod.POST, // 可选,默认为http.RequestMethod.GET
    // 当使用POST请求时此字段用于传递请求体内容,具体格式与服务端协商确定
    extraData: 'data to send',
    expectDataType: http.HttpDataType.STRING, // 可选,指定返回数据的类型
    usingCache: true, // 可选,默认为true
    priority: 1, // 可选,默认为1
    // 开发者根据自身业务需要添加header字段
    header: new Header('application/json'),
    readTimeout: 60000, // 可选,默认为60000ms
    connectTimeout: 60000, // 可选,默认为60000ms
    usingProtocol: http.HttpProtocol.HTTP1_1, // 可选,协议类型默认值由系统自动指定
    usingProxy: false, //可选,默认不使用网络代理,自API 10开始支持该属性
    caPath: '/path/to/cacert.pem', // 可选,默认使用系统预设CA证书,自API 10开始支持该属性
    clientCert: { // 可选,默认不使用客户端证书,自API 11开始支持该属性
      certPath: '/path/to/client.pem', // 默认不使用客户端证书,自API 11开始支持该属性
      keyPath: '/path/to/client.key', // 若证书包含Key信息,传入空字符串,自API 11开始支持该属性
      certType: http.CertType.PEM, // 可选,默认使用PEM,自API 11开始支持该属性
      keyPassword: "passwordToKey" // 可选,输入key文件的密码,自API 11开始支持该属性
    },
    multiFormDataList: [ // 可选,仅当Header中,'content-Type'为'multipart/form-data'时生效,自API 11开始支持该属性
      {
        name: "Part1", // 数据名,自API 11开始支持该属性
        contentType: 'text/plain', // 数据类型,自API 11开始支持该属性
        data: 'Example data', // 可选,数据内容,自API 11开始支持该属性
        remoteFileName: 'example.txt' // 可选,自API 11开始支持该属性
      }, {
        name: "Part2", // 数据名,自API 11开始支持该属性
        contentType: 'text/plain', // 数据类型,自API 11开始支持该属性
        // data/app/el2/100/base/com.example.myapplication/haps/entry/files/fileName.txt
        filePath: `${getContext(this).filesDir}/fileName.txt`, // 可选,传入文件路径,自API 11开始支持该属性
        remoteFileName: 'fileName.txt' // 可选,自API 11开始支持该属性
      }
    ]
  },
  (err: BusinessError, data: http.HttpResponse) => {
    if (!err) {
      // data.result为HTTP响应内容,可根据业务需要进行解析
      console.info('Result:' + JSON.stringify(data.result));
      console.info('code:' + JSON.stringify(data.responseCode));
      console.info('type:' + JSON.stringify(data.resultType));
      // data.header为HTTP响应头,可根据业务需要进行解析
      console.info('header:' + JSON.stringify(data.header));
      console.info('cookies:' + JSON.stringify(data.cookies)); // 自API version 8开始支持cookie
      // 取消订阅HTTP响应头事件
      httpRequest.off('headersReceive');
      // 当该请求使用完毕时,开发者务必调用destroy方法主动销毁该JavaScript Object。
      httpRequest.destroy();
    } else {
      console.info('error:' + JSON.stringify(err));
      // 取消订阅HTTP响应头事件
      httpRequest.off('headersReceive');
      // 当该请求使用完毕时,开发者务必调用destroy方法主动销毁该JavaScript Object。
      httpRequest.destroy();
    }
  });

DnsOverHttpsConfiguration

DnsOverHttpsConfiguration接口允许开发人员配置HTTPS上的DNS(DOH)设置,从而通过HTTPS端点实现安全的DNS解析。

系统能力:SystemCapability.Collaboration.RemoteCommunication

起始版本:4.1.0(11)

属性:

名称

类型

只读

必填

说明

url

URLOrString

DOH端点的URL或字符串表示形式。

skipCertificatesValidation

boolean

指定是否跳过DOH终结点的SSL/TLS证书验证。默认值为false。

示例:

// Configure DNS over HTTPS settings
const dohConfig: rcp.DnsOverHttpsConfiguration = {
  url: "https://dns.example.com/dns-query",
  skipCertificatesValidation: true,
};

// Use the DNS over HTTPS configuration in the session creation
const sessionWithDoh = rcp.createSession({ requestConfiguration: { dns: { dnsOverHttps: dohConfig } } });

网络请求静态配置

Configuration

Configuration接口包含一组配置参数,开发人员可以利用这些参数来微调会话中HTTP请求的行为。这包括传输、跟踪、代理、DNS和安全配置的设置。

系统能力:SystemCapability.Collaboration.RemoteCommunication

起始版本:4.1.0(11)

属性:

名称

类型

只读

必填

说明

transfer

TransferConfiguration

配置与HTTP请求期间的数据传输相关的各个方面,例如自动重定向和超时设置。

tracing

TracingConfiguration

使开发人员能够在HTTP请求期间捕获详细的跟踪信息,有助于调试和性能分析。

proxy

ProxyConfiguration

配置会话的代理设置,允许开发人员定义'system'、'no-proxy'或WebProxy配置。

dns

DnsConfiguration

指定与DNS相关的配置,包括自定义DNS规则和通过HTTPS使用DNS的选项。

security

SecurityConfiguration

包括用于处理安全相关方面的设置,如证书和服务器身份验证。

示例:

const requestConfig: rcp.Configuration = {
  transfer: {
    autoRedirect: true,
    timeout: {
      connectMs: 5000,
      transferMs: 10000,
    },
    assumesHTTP3Capable: true,
    pathPreference: "cellular",
  },
  tracing: {
    verbose: true,
  },
  proxy: "system",
  dns: {
    dnsRules: [
      { host: "https://example.com", port: 443, ipAddresses: ["192.168.1.1", "192.168.1.2"] }
    ]
  },

  security: {
    certificate: {
      content: "-----BEGIN CERTIFICATE-----\n...",
      type: "PEM",
      key: "-----BEGIN PRIVATE KEY-----\n...",
      keyPassword: "your-password",
    },
    serverAuthentication: {
      credential: {
        username: "your-username",
        password: "your-password",
      },
      authenticationType: "basic",
    },
  },
};

// Use the configuration in the session creation
const session = rcp.createSession({ requestConfiguration: requestConfig });

在网络请求中获取相应的跟踪数据

TransferConfiguration

TransferConfiguration接口为开发人员提供了一组选项,用于调整会话中HTTP请求期间的数据传输行为。这包括与自动重定向和超时配置相关的设置。

系统能力:SystemCapability.Collaboration.RemoteCommunication

起始版本:4.1.0(11)

属性:

名称

类型

只读

必填

说明

autoRedirect

boolean

指定HTTP客户端是否应自动遵循重定向。如果设置为true,客户端将自动遵循HTTP重定向;否则,它不会。默认值为true。

timeout

Timeout

配置HTTP请求的超时值,允许开发人员定义连接和传输数据所允许的最长时间。如果未设置,则使用默认时间。

assumesHTTP3Capable

boolean

指定连接是否具有HTTP/3功能。

  • true:连接具有HTTP/3功能;
  • false:连接不具有HTTP/3功能;
  • 默认值为false。

pathPreference

PathPreference

这只是调用者的一个建议,系统决定使用哪个路径。可以是'自动'或'蜂窝'路径。默认为'自动'路径。

serviceType

ServiceType

服务类型。默认为undefined。

示例:

const transferConfig: rcp.TransferConfiguration = {
  autoRedirect: true,
  timeout: {
    connectMs: 5000,
    transferMs: 10000,
  },
  assumesHTTP3Capable: true,
  pathPreference: "cellular",
};

// Use the configuration in the session creation
const session = rcp.createSession({ requestConfiguration: { transfer: transferConfig } });


原文地址:https://blog.csdn.net/wu1004019946/article/details/139768393

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!