HarmonyOS 鸿蒙Next中全局禁止HTTP明文传输

HarmonyOS 鸿蒙Next中全局禁止HTTP明文传输 HTTP明文设置 明文http访问权限配置说明

通过查阅以上两个链接的内容,了解到全局禁止http明文传输是从API 20支持的。

那么之前的5.0.3(API 15)怎么设置全局禁止http明文传输呢?只能在请求的时候配置吗?


更多关于HarmonyOS 鸿蒙Next中全局禁止HTTP明文传输的实战教程也可以访问 https://www.itying.com/category-93-b0.html

15 回复

之前确实没有的,在 HarmonyOS 5.0.3(API 15)中,系统并未提供全局禁止 HTTP 明文传输的配置文件或开关。从 HarmonyOS 6.1.0开始,才正式支持通过 network_config.json进行全局明文传输策略配置。因此,在 API 15 版本上,你无法像后期版本那样通过一个统一的配置文件禁止所有 HTTP 明文请求。

支持起点:全局禁止 HTTP 明文传输的配置能力始于 HarmonyOS 6.1.0(API 23)。该版本引入了 network_config.json文件,允许开发者在应用安装时即定义明文传输策略。

配置方式:在 src/main/resources/base/profile/network_config.json中设置 cleartextTrafficPermitted为 false,即可全局禁止 HTTP 明文访问(仅允许 HTTPS)。此配置同时支持按域名细粒度控制。

给你一个替代方案:

由于 API 15 缺少上述全局配置机制,你需要通过代码层面的约束来达到禁止 HTTP 明文传输的目的。主要可采取以下两种方式:

在发起每个网络请求时强制使用 HTTPS

在所有使用 @kit.NetworkKit中的 http模块发起请求的地方,确保 URL 均以 https://开头。你可以在封装网络请求工具类时,对传入的 URL 进行校验,若为 http://则自动转换为 https://或直接抛出错误提示

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

function safeRequest(url: string, options: http.HttpRequestOptions): Promise<http.HttpResponse> {
  // 强制把 http:// 换成 https://
  if (url.startsWith('http://')) {
    url = 'https://' + url.slice(7);
  }
  return new Promise((resolve, reject) => {
    const req = http.createHttp();
    req.request(url, options, (err, data) => {
      if (err) reject(err);
      else resolve(data);
      req.destroy();
    });
  });
}

使用自定义安全拦截层

在应用内统一网络请求入口(例如封装的 HTTP 客户端)中,增加 URL 协议检查逻辑。对于尝试使用 HTTP 的请求,可以中断请求并记录日志或提示用户。这种方式虽无法阻止底层 Socket 建立 HTTP 连接,但能在应用业务层杜绝明文请求的发出。

当然了,若你的应用对通信安全有较高要求,建议尽快将目标 API 版本升级至 23 及以上,以便利用系统提供的全局网络安全配置能力。这不仅能更彻底地禁止明文传输,还可减少代码中的冗余检查,提升可维护性。

更多关于HarmonyOS 鸿蒙Next中全局禁止HTTP明文传输的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


确实是,

API20开始,官方支持在module.json5中新增网络安全配置,可以通过配置全局禁止明文HTTP:

{
  "module": {
    "networkSecurityConfig": {
      "baseConfig": {
        "cleartextTrafficPermitted": false  //全局禁止明文HTTP
      }
    }
  }
}

但在API15版本是没有这个配置的,默认允许HTTP也没有全局拦截机制。就如你所说在网络请求时来拦截控制

// 请求入口统一校验协议
static validateUrl(url: string): void {
	if (url.startsWith('http://')) {
	  throw new Error(`HTTP请求被拦截: ${url},请使用 HTTPS`);
	}
}

还有个静默切换方式(强制去使用HTTPS)

static enforceHttps(url: string): string {
    if (url.startsWith('http://')) {
      let upgraded: string = url.replace('http://', 'https://');
      console.warn(`自动切换为HTTPS: ${upgraded}`);
      return upgraded;
    }
    return url;
}

希望对你有帮助

对于不支持配置文件里全局设置的版本,封装整个App的网络请求到一处,在出口处拦截请求限制一下就行了。
参考下《拦截器》

在api20以前系统并未提供全局禁止HTTP明文传输的配置能力;
1、在代码中强制使用HTTPS
在发起网络请求时,确保所有请求的URL都使用https://协议前缀,并避免使用http://。这是最直接有效的方法

2、在服务器端进行重定向或限制:在您的服务器配置中,将所有HTTP请求重定向到HTTPS,或者直接拒绝HTTP明文请求。这样即使客户端尝试发起HTTP请求,也会被服务器强制升级或阻止

【解决方案】
开发者您好,5.0.3(API15)中无法设置全局禁止http明文传输,提供如下两种方案实现禁止http明文传输:
1、服务端实施拦截(HSTS 策略):在您的服务器(Nginx、网关)配置 HSTS(HTTP Strict Transport Security) 响应头。当客户端第一次安全访问过你的HTTPS服务器后,系统内核/网络库会记录该域名。之后只要应用内试图向该域名发送http:// 请求,系统底层的网络库在建立连接前就会在本地直接将其重定向(内部 307 跳转)为 https://。
2、在客户端封装接口请求,基于面向对象/依赖注入的架构封装方式:
接口的URL通过一个全局的Environment或Config类生成,参考如下示例:
(1)、全局环境配置文件

export class AppConfig {
  // 将BASE_URL设为只读,且在编译期/初始化时就强制为https
  private static readonly HOST = "api.example.com";

  public static getBaseUrl(): string {
    // 源头:无论如何返回的都是 https
    return `https://${AppConfig.HOST}`;
  }
}

(2)、 接口的URL定义

const loginUrl = `${AppConfig.getBaseUrl()}/user/login`;

丢!你是技术支持嘛?和我工单中回答的一样啊。看这个回答,是API 15中没有类似的全局配置的方式了。

开发者您好,5.0.3(API15)中是无法设置全局禁止http明文传输的,提供上述两种方案实现禁止http明文传输供参考。

好的,感谢

可以从“配置 + 代码入口 + Web 容器”三层一起做,效果会比只靠某个请求库更稳。HTTPS 像给所有快递都加封条,HTTP 明文则是敞口纸箱;如果项目里还有第三方 SDK 或 Web 页面,只在业务封装里拦截可能会漏。

第一层,检查工程网络安全配置,不要开启允许明文流量的开关,不要给 base-config 或全局配置放行 HTTP。第二层,把应用内网络请求统一收口,比如封装 request 方法,启动时校验 baseUrl 必须是 https,发现 http 直接拒绝或只允许 debug 环境。第三层,如果用了 ArkWeb/WebView,要拦截页面跳转和资源请求,对 http 链接做阻断、升级到 https 或给出错误页。

另外 CI 可以加一个静态扫描:搜索 http://、cleartext、明文放行配置,避免上线前混入测试地址。参考来源:HarmonyOS 网络安全配置、HTTP 数据请求、ArkWeb 安全最佳实践。

5.0.3不是不支持全局网络配置吗?能配置吗?

换个思路,比如装 @ohos/axios 里面配置 axios.default.baseURL一样 就可以操作了

嗯嗯,目前也有这个思路的,不过想看看有没有其他方法来配置,最好是和全局配置类似的,在统一配置维护上比较优好。

没有看到API 15对应的文档,不行的话最好还是升级下API吧

在鸿蒙Next中,可通过配置网络安全策略文件network_config.json全局禁用HTTP明文传输。在src/main/resources/base/profile/目录下创建该文件,设置cleartextTrafficPermittedfalse。此配置对所有网络请求生效,强制使用HTTPS。

API 15 及更早版本不支持全局禁止 HTTP 明文传输,只能通过在单次请求中配置 usingProtocol"https" 来保证不发起明文请求,或在发起 HTTP 请求时通过 ohos.permission.INTERNET 配合拦截器逐条检查。从 API 20 开始才提供全局开关,因此若要在旧版本实现全量禁止,只能逐个请求配置或通过封装统一的请求工具类强制使用 HTTPS。

回到顶部