HarmonyOS鸿蒙Next中ArkWeb如何像浏览器一样删掉域名安全策略正常访问https变成http的网页?

HarmonyOS鸿蒙Next中ArkWeb如何像浏览器一样删掉域名安全策略正常访问https变成http的网页? 由于一些原因,一个网站本来又SSL,https访问,但是现在关掉了,但是arkweb还是默认走https,写了http还是这样,如何像浏览器一样输入chrome://net-internals/#hsts,在里面Delete domain security policies这里删掉域名的hsts缓存?

13 回复

ArkWeb也是可以访问http协议的,这个应该是跟你的服务器配置有关吧,是不是配置了将http重定向为https,也就是会造成访问http都会默认定向访问https。

取消 HTTP 访问重定向到 HTTPS 的操作,核心是删除或注释掉服务器配置中对应的重定向规则,不同类型的 Web 服务器配置位置和方式不同,以下例举Nginx 服务器具体操作步骤:

  1. 找到配置文件 Nginx 的 HTTP/HTTPS 配置通常在 /etc/nginx/nginx.conf,或 /etc/nginx/conf.d/ 目录下的站点配置文件(如 yourdomain.conf)。

  2. 定位并删除重定向规则 打开配置文件,找到监听 80 端口(HTTP)的 server 块,里面会有类似以下的重定向代码,删除或用 # 注释掉

    server {
        listen 80;
        server_name yourdomain.com www.yourdomain.com;
        # 以下是 HTTP 重定向 HTTPS 的规则,需要删除/注释
        return 301 https://$host$request_uri;
    }
    
  3. 验证并重启 Nginx

    • 验证配置语法:nginx -t
    • 重启 Nginx 生效:systemctl restart nginx

更多关于HarmonyOS鸿蒙Next中ArkWeb如何像浏览器一样删掉域名安全策略正常访问https变成http的网页?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


服务器之前配置是走https,arkweb访问过。现在服务器改成http了,但是arkweb还是强制走https,服务器配置不能改,我需要刷新/更新/充值受影响的客户端的arkweb。

继续回帖,你可以使用其它的浏览器试着访问一下页面,是不也会强制走HTTPS。如果是的话,可以看一下你们的服务器的HSTS配置,可以参考下:https://baike.baidu.com/item/HTTP严格传输安全协议/16018283

根据您的问题,我来为您详细解答 ArkWeb 如何处理 HSTS 缓存和 HTTP/HTTPS 访问的问题:

问题分析

您遇到的情况是:

  • 网站原本有 SSL,可以通过 HTTPS 访问
  • 现在网站关闭了 SSL,只能通过 HTTP 访问
  • 但 ArkWeb 仍然默认使用 HTTPS 访问
  • 您希望像 Chrome 浏览器一样删除域名的 HSTS 缓存

解决方案

方案一:清除 ArkWeb 的 HSTS 缓存

ArkWeb 没有像 Chrome 那样的专门 HSTS 管理界面,但可以通过以下方式清除相关缓存:

import { webview } from '@kit.ArkWeb';
import { BusinessError } from '@kit.BasicServicesKit';

@Entry
@Component
struct WebComponent {
  controller: webview.WebviewController = new webview.WebviewController();
  
  // 清除Web缓存(包括HSTS相关缓存)
  clearWebCache() {
    try {
      // 清除当前WebView的缓存
      this.controller.removeCache(true); // true表示同时清除ROM和RAM中的缓存
      
      // API 18及以上版本可以使用静态方法清除所有Web缓存
      if (webview.WebviewController.removeAllCache) {
        webview.WebviewController.removeAllCache(true);
      }
      
      console.log('Web缓存清除成功');
    } catch (error) {
      console.error(`清除缓存失败: ${(error as BusinessError).message}`);
    }
  }
  
  build() {
    Column() {
      Button('清除Web缓存')
        .onClick(() => this.clearWebCache())
      
      Web({ 
        src: 'http://your-domain.com', // 注意这里使用HTTP协议
        controller: this.controller 
      })
      .mixedMode(webview.MixedMode.All) // 允许HTTP和HTTPS混合内容
      .cacheMode(webview.CacheMode.Online) // 不使用缓存,直接从网络获取
    }
  }
}

方案二:使用隐私模式(推荐)

开启隐私模式可以避免 HSTS 策略被持久化保存:

Web({ 
  src: 'http://your-domain.com',
  controller: this.controller,
  incognitoMode: true // 开启隐私模式
})

效果:在隐私模式下,HSTS 策略不会被保存到本地,关闭 WebView 后相关策略会被清除。

方案三:配置网络安全策略

在 module.json5 中配置允许 HTTP 访问:

{
  "module": {
    "metaData": {
      "customData": [
        {
          "name": "ohos.application.networkSecurityConfig",
          "value": "rawfile/network_security_config.xml"
        }
      ]
    }
  }
}

创建 src/main/resources/rawfile/network_security_config.xml:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
  <!-- 允许指定域名的HTTP请求 -->
  <domain-config cleartextTrafficPermitted="true">
    <domain includeSubdomains="true">your-domain.com</domain>
  </domain-config>
</network-security-config>

方案四:强制使用 HTTP 协议

如果上述方法仍不生效,可以尝试直接修改请求:

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

async function forceHttpAccess(url: string) {
  let httpRequest = http.createHttp();
  try {
    // 直接使用HTTP协议请求
    let response = await httpRequest.request(
      url.replace('https://', 'http://'), // 强制替换为HTTP
      {
        method: http.RequestMethod.GET,
        usingProxy: false, // 禁用代理
        header: {
          'Connection': 'close' // 关闭长连接,避免缓存影响
        }
      }
    );
    
    if (response.responseCode === 200) {
      // 将HTML内容直接加载到WebView
      this.controller.loadData({
        data: response.result.toString(),
        mimeType: 'text/html',
        encoding: 'utf-8'
      });
    }
  } catch (err) {
    console.error('HTTP请求失败', err);
  } finally {
    httpRequest.destroy();
  }
}

完整解决方案

结合以上方法,推荐的完整解决方案:

import { webview } from '@kit.ArkWeb';
import { BusinessError } from '@kit.BasicServicesKit';

@Entry
@Component
struct WebComponent {
  controller: webview.WebviewController = new webview.WebviewController();
  @State url: string = 'http://your-domain.com';
  
  async onPageShow() {
    // 页面显示时清除缓存
    this.clearWebCache();
  }
  
  clearWebCache() {
    try {
      this.controller.removeCache(true);
      if (webview.WebviewController.removeAllCache) {
        webview.WebviewController.removeAllCache(true);
      }
    } catch (error) {
      console.error(`清除缓存失败: ${(error as BusinessError).message}`);
    }
  }
  
  build() {
    Column() {
      Web({ 
        src: this.url,
        controller: this.controller,
        incognitoMode: true // 开启隐私模式
      })
      .mixedMode(webview.MixedMode.All) // 允许混合内容
      .cacheMode(webview.CacheMode.Online) // 不使用缓存
      .onPageBegin((event) => {
        console.log(`开始加载: ${event.url}`);
        // 确保使用HTTP协议
        if (event.url.startsWith('https://') && event.url.includes('your-domain.com')) {
          event.url = event.url.replace('https://', 'http://');
        }
      })
    }
  }
}

注意事项

  1. HSTS 预加载列表:如果您的域名被加入了浏览器的 HSTS 预加载列表,即使清除缓存也无法解决,这种情况需要联系浏览器厂商移除。

  2. 服务器配置:确保服务器已经正确关闭了 HSTS,检查响应头中是否还有Strict-Transport-Security

  3. 测试建议

    • 在测试环境中使用较短的 HSTS max-age 值
    • 测试时可以使用隐私模式避免缓存影响
    • 清除缓存后重启应用
  4. 生产环境:生产环境建议使用 HTTPS,只有在特殊情况下才使用 HTTP。

通过以上方法,您应该能够解决 ArkWeb 强制使用 HTTPS 访问已关闭 SSL 的网站的问题。如果问题仍然存在,建议检查服务器配置是否完全关闭了 HSTS,或者尝试使用新的域名进行测试。

你好,如果是需要忽略ssl证书,可以使用下面的 方法:

【背景知识】 Web组件默认会使用系统内置的SSL证书验证机制,这通常是为了确保加载的网页内容的安全性,防止中间人攻击等安全威胁。然而有时候,会出现签名证书过期的问题,或者需要使用自己软件签发的自签名SSL证书等其他原因,可能需要绕过或自定义SSL证书验证过程。

【解决方案】 可以尝试使用onSslErrorEvent通知用户加载资源(主资源+子资源),忽略SSL验证。如果只想处理主资源的SSL错误,请用isMainFrame字段进行区分,参考:通知用户加载资源(主资源+子资源)时发生SSL错误。 示例:

Web({
   src: 'www.example.com',
   controller: this.controller
})
.onSslErrorEvent(event => {
   event.handler.handleConfirm();
})

服务器之前配置是走https,arkweb访问过。现在服务器改成http了,但是arkweb还是强制走https,服务器配置不能改,我需要刷新/更新/重置受影响的客户端的arkweb。除了写代码,有其他办法吗?因为不是所有的客户端(访问过https的arkweb)都受到了影响,

公司有运维的话,就试试配置重定向。通常都是http重定向到https,但是看你描述的需要像是反过来的,不知是否可行。

直接使用http访问网站试试

服务器之前是https访问,客户端也是https访问。 现在服务器改成http了,客户端不管怎么写,都是强制https,有hsts的安全限制。

关注,顶帖

浏览器的解决方案

ArkWeb组件默认遵循系统安全策略,不支持直接降级HTTPS为HTTP访问。若需访问HTTP网页,需确保目标服务器支持HTTPS或使用本地调试服务器。鸿蒙Next的网络安全机制强制要求安全连接,无法通过配置绕过该限制。

在HarmonyOS Next的ArkWeb中,目前没有提供类似Chrome浏览器中chrome://net-internals/#hsts这样的图形化界面或直接命令来手动删除特定域名的HSTS(HTTP Strict Transport Security)缓存或安全策略。

ArkWeb作为系统WebView,其网络安全行为(包括HSTS缓存)通常由系统级的网络栈管理,旨在遵循安全最佳实践,强制已声明HSTS的域名使用HTTPS。当网站从HTTPS降级到HTTP时,由于HSTS记录尚未过期,会导致访问失败。

当前可行的解决方案思路如下:

  1. 清除全局WebView数据:最直接的方法是清除ArkWeb/WebView的整个缓存和数据,这通常会一并清除HSTS状态。可以通过ArkWeb的WebStorageControllerWebCacheController等API来清除缓存、Cookie等数据。但这是一个全局操作,会清除所有站点的数据。

    // 示例:获取WebController并清除数据
    // 需要在合适的时机调用,例如应用设置中的“清除缓存”功能
    // 具体API请参考最新官方文档
    
  2. 等待HSTS过期:HSTS策略中通常包含一个max-age指令,指定策略的有效期(例如一年)。在有效期内,浏览器或WebView会强制使用HTTPS。最自然的解决方式是等待该域名的HSTS记录自然过期。过期后,访问将不再被强制跳转到HTTPS。

  3. 应用/系统级重置:对于开发或测试环境,可以尝试卸载并重新安装您的HarmonyOS应用,或者清除整个应用的数据(在系统设置中找到应用管理,选择您的应用,执行“清除数据”操作)。这通常会重置WebView的所有状态。对于系统级WebView,可能需要重置系统网络设置或等待系统更新缓存。

  4. 开发者选项(如果未来提供):关注HarmonyOS SDK的更新。未来版本可能会在开发者选项或ArkWeb的调试工具中增加管理安全策略的功能。

重要提醒:HSTS是一项关键的安全功能,旨在防止中间人攻击和协议降级攻击。手动绕过或删除HSTS缓存会降低访问该网站时的安全性,应仅在您完全信任网络环境且明确了解风险的情况下(如针对本地测试服务器或已确认安全的内部网站),出于开发或调试目的进行此类操作。

由于ArkWeb的实现深度集成于HarmonyOS系统,且以安全为首要原则,目前并未开放类似桌面浏览器那样的细粒度、针对单个域名的HSTS策略管理界面。处理此类问题的标准流程应是网站服务器端正确配置或等待策略过期。

回到顶部