基于HarmonyOS鸿蒙Next的HTTPS请求过程开发示例(ArkTS)

基于HarmonyOS鸿蒙Next的HTTPS请求过程开发示例(ArkTS)

一、介绍

本篇Codelab基于网络模块以及Webview实现一次HTTPS请求,并对其过程进行抓包分析。效果如图所示:

HTTPS请求过程

相关概念

  • Webview:提供Web控制能力,Web组件提供网页显示能力。
  • HTTP数据请求:网络管理模块,提供HTTP数据请求能力,支持GET、POST、OPTIONS、HEAD、PUT、DELETE、TRACE、CONNECT请求方法。
  • HTTPS:应用层协议,支持加密传输以及身份认证,保证数据的安全传输。
  • SSL:SSL(Secure Socket Layer)安全套接层是位于传输通信协议(TCP/IP)之上实现的一种安全协议。
  • TLS:TLS(Transport Layer Security)是一种安全协议,旨在实现数据加密传输。

完整示例

gitee源码地址

源码下载

HTTPS请求过程(ArkTS).zip

二、环境搭建

我们首先需要完成HarmonyOS开发环境搭建,可参照如下步骤进行。

软件要求

硬件要求

  • 设备类型:华为手机或运行在DevEco Studio上的华为手机设备模拟器。
  • HarmonyOS系统:3.1.0 Developer Release。

环境搭建

  1. 安装DevEco Studio,详情请参考下载和安装软件
  2. 设置DevEco Studio开发环境,DevEco Studio开发环境需要依赖于网络环境,需要连接上网络才能确保工具的正常使用,可以根据如下两种情况来配置开发环境:
    • 如果可以直接访问Internet,只需进行下载HarmonyOS SDK操作。
    • 如果网络不能直接访问Internet,需要通过代理服务器才可以访问,请参考配置开发环境
  3. 开发者可以参考以下链接,完成设备调试的相关配置:

三、代码结构解读

本篇Codelab只对核心代码进行讲解,对于完整代码,我们会在源码下载或gitee中提供。

├──entry/src/main/ets                // 代码区
│  ├──common
│  │  ├──constants
│  │  │  ├──StyleConstants.ets       // 样式常量类 
│  │  │  └──CommonConstants.ets      // 常量类
│  │  └──utils
│  │     ├──HttpUtil.ets             // 网络请求方法
│  │     └──Logger.ets               // 日志打印工具类
│  ├──entryability
│  │  └──EntryAbility.ts             // 程序入口类
│  └──pages
│     └──WebPage.ets                 // 页面入口
└──entry/src/main/resources          // 资源文件目录

四、创建HTTPS请求

HTTPS协议是位于应用层的一种安全传输协议,与HTTP最大的区别是服务端与客户端之间进行数据传输都会经过TLS/SSL加密。该示例请求HarmonyOS官网,并将请求得到的内容通过Web容器展示出来。效果如图所示:

HTTPS请求过程

首先在HttpUtil.ets中调用createHttp方法创建一个请求任务,再通过request方法发起网络请求。该方法支持三个参数:url、options以及callback回调,其中options可以设置请求方法、请求头以及超时时间等。

接着在入口页面中调用上述封装的httpGet方法请求指定网址,将请求得到的内容嵌入到Web组件中。

五、TLS/SSL握手过程

本章节主要通过抓包数据分析TLS协议的握手过程,其中包括交换参数、证书验证、密钥计算以及验证密钥等,抓包内容如图所示:

TLS握手过程

5.1 第一次握手

根据下图中可以看到,客户端首先会进行第一次握手连接,发送“Client Hello”消息给服务端开启一个新的会话连接。分析数据包得到,客户端在第一次握手时会向服务端传递协议版本号(TLS1.2)、随机数(Client Random,用于后续生成“会话密钥”)、Session ID以及Cipher Suites(客户端支持的密码套件)。数据内容如图所示:

TLS握手过程

5.2 第二次握手

服务端接收到客户端数据后,将响应数据通过“Sever Hello”传递给客户端,包括随机数(Sever Random,用于后续生成“会话密钥”)、协议版本号(TLS1.2)以及Cipher Suite(任意选择一个客户端支持的密码套件),数据内容如图所示:

TLS握手过程

服务端传递“Sever Hello”后,紧跟着会将Certificate(证书)、“Sever Key Exchange”消息以及“Server Hello Done”消息传递给客户端。此处着重分析“Sever Key Exchange”,数据内容如图所示:

TLS握手过程

可以看到“Sever Key Exchange”消息中主要包括密钥交换算法EC Diffie-Hellman(简称ECDHE)以及携带的额外数据(Server Params)。Server Params参数包含Curve Type、Named Curve以及Pubkey,分别代表曲线类型、曲线名称以及椭圆曲线公钥(用于实现密钥交换算法)。接着将曲线公钥(Pubkey)通过服务端私钥进行加密并传递给客户端。

5.3 第三次握手

客户端收到“Server Hello Done”消息后,会将Client Params数据传递给服务端,其中包含自身生成的椭圆曲线公钥(Pubkey),数据内容如图所示:

TLS握手过程

经过上述过程,客户端持有Client Random、Server Random以及Server Params,将Server Params使用服务端公钥解密后得到“Server Key Exchange”消息中的临时公钥,客户端使用x25519算法计算出预主密钥(Premaster Secret),然后再结合客户端随机数、服务端随机数以及预主密钥生成主密钥,最终构建“会话密钥”。“Change Cipher Spec”消息表示客户端已经生成密钥,并切换到加密模式。最后将之前所有的握手数据做一个摘要,再利用双方协商好的对称密钥进行加密, 通过“Encrypted Handshake Message”消息将加密数据传递给服务端做校验。数据内容如图所示:

TLS握手过程

5.4 第四次握手

服务端利用Client Random、Server Random以及Client Params计算得出“会话密钥”,向客户端传递“Change Cipher Spec”和“Encrypted Handshake Message”消息供客户端校验。当双方校验通过后,真正的数据才开始传输。

TLS握手过程

六、总结

您已经完成了本次Codelab的学习,并了解到以下知识点:

  1. 使用@ohos.net.http建立一次https请求。
  2. 通过分析TLS/SSL握手过程中的传输数据包来理解数据安全传输。

更多关于基于HarmonyOS鸿蒙Next的HTTPS请求过程开发示例(ArkTS)的实战教程也可以访问 https://www.itying.com/category-93-b0.html

6 回复

怎么解决

更多关于基于HarmonyOS鸿蒙Next的HTTPS请求过程开发示例(ArkTS)的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


同问,

调同一个借口 web端有数据,

harmonyOS一直返回{"responseCode":0,"cookies":"","header":{},"result":"","resultType":0} 怎么解决

发起请求一直返回{"responseCode":0,"cookies":"","header":{},"result":"","resultType":0},如何解决?

Mate60pro 无法更新 4.0.0.132 一直提示安装包校验失败 多次尝试重装系统都没用 还显示预置应用或系统文件损坏 需要更新 但是更新又失败 要怎么解决

在HarmonyOS鸿蒙Next中,使用ArkTS进行HTTPS请求的开发步骤如下:

  1. 导入模块:首先导入@ohos.net.http模块,用于处理HTTP/HTTPS请求。

  2. 创建请求对象:使用http.createHttp()方法创建一个HTTP请求对象。

  3. 配置请求:设置请求的URL、方法(如GET或POST)、头部信息等。

  4. 发送请求:调用request()方法发送请求,并处理返回的Promise对象。

  5. 处理响应:在Promise的then回调中处理响应数据,如解析JSON或处理错误。

  6. 关闭连接:请求完成后,调用destroy()方法关闭连接,释放资源。

以下是一个简单的HTTPS GET请求示例:

import http from '@ohos.net.http';

let httpRequest = http.createHttp();
httpRequest.request(
  "https://example.com/api/data",
  {
    method: http.RequestMethod.GET,
    header: {
      'Content-Type': 'application/json'
    }
  }
).then((response) => {
  console.log('Response data:', response.result);
}).catch((err) => {
  console.error('Request failed:', err);
}).finally(() => {
  httpRequest.destroy();
});

该示例展示了如何使用ArkTS在HarmonyOS中进行HTTPS请求。

回到顶部