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
之前确实没有的,在 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明文传输供参考。
好的,感谢
5.0.3不是不支持全局网络配置吗?能配置吗?
换个思路,比如装 @ohos/axios 里面配置 axios.default.baseURL一样 就可以操作了
嗯嗯,目前也有这个思路的,不过想看看有没有其他方法来配置,最好是和全局配置类似的,在统一配置维护上比较优好。
没有看到API 15对应的文档,不行的话最好还是升级下API吧
在鸿蒙Next中,可通过配置网络安全策略文件network_config.json全局禁用HTTP明文传输。在src/main/resources/base/profile/目录下创建该文件,设置cleartextTrafficPermitted为false。此配置对所有网络请求生效,强制使用HTTPS。
API 15 及更早版本不支持全局禁止 HTTP 明文传输,只能通过在单次请求中配置 usingProtocol 为 "https" 来保证不发起明文请求,或在发起 HTTP 请求时通过 ohos.permission.INTERNET 配合拦截器逐条检查。从 API 20 开始才提供全局开关,因此若要在旧版本实现全量禁止,只能逐个请求配置或通过封装统一的请求工具类强制使用 HTTPS。


