HarmonyOS 鸿蒙Next中web加载前端页面怎么跳过安全证书验证

HarmonyOS 鸿蒙Next中web加载前端页面怎么跳过安全证书验证

web加载前端页面 显示空白页 我联调也不报错啥的 用手机直接加载这个地址 会出现loading提示 但是鸿蒙直接加载是空白页。手机直接加载地址是 会出现一个当前网站的安全证书已过期或不可信。是不是 web要加载时候跳过安全验证 因为之前发送网络请求 采用了rcp 自定义skip来跳过ssl验证的。遇到这种情况需要怎么解决

8 回复

【背景知识】

HTTP模块提供了标准的HTTP网络服务能力,Remote Communication Kit(远场通信服务)提供了场景化的网络服务能力,详见Remote Communication Kit简介,可根据应用的需要选择使用。

【解决方案】

为了安全考虑,除特殊情况,一般不建议跳过SSL校验,如果必须跳过,可以参考以下方法忽略证书校验:

网络请求使用RCP(Remote Communication Kit),可以通过配置SecurityConfiguration中的RemoteValidation为skip跳过证书校验(需要API18及以上才支持)。可参考如下代码:

import { rcp } from '@kit.RemoteCommunicationKit';
import { BusinessError } from '@kit.BasicServicesKit';

const session = rcp.createSession();
const request = new rcp.Request('https://xxx.xxx.xxx/xxx','GET');
request.configuration = {
  security: {
    remoteValidation: 'skip', // 'system' | 'skip' |CertificateAuthority | ValidationCallback。`system`表示使用系统CA验证远端服务器身份,值固定为`system`字符串,是未配置时的默认值。`skip`表示跳过验证远端服务器身份流程,值固定为`skip`字符串。
  },
};
session.fetch(request).then((rep: rcp.Response) => {
  console.info(`Response succeeded: ${rep}`);
}).catch((err: BusinessError) => {
  console.error(`Response err: Code is ${err.code}, message is ${err.message}`);
});

更多关于HarmonyOS 鸿蒙Next中web加载前端页面怎么跳过安全证书验证的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


Web() .onSslErrorEventReceive((event) => { event.handler.handleConfirm(); }) .onSslErrorEvent((event) => { event.handler.handleConfirm(); })

对于不安全的https, 直接加载会报错, 你可以上面的方法,绕过 SSL 证书处理。

针对SSL证书验证,web组件提供了相应的事件处理错误,请看API:

cke_782.png

代码如下:

import { webview } from "@kit.ArkWeb"

@Entry
@Component
struct Index {

  webviewController:webview.WebviewController = new webview.WebviewController();

  build() {
    Column() {

      Web({
        src: "www.baidu.com/",
        controller: this.webviewController
      }).height("80%")
        .onSslErrorEventReceive((err)=>{
        if (err.error) {
          console.error('ssl 证书错误:'+JSON.stringify(err))
        }
        err.handler.handleConfirm()
      })

      Button("加载过期证书网站").onClick((event: ClickEvent) => {
        this.webviewController.loadUrl("https://expired.badssl.com")
      })
    }
  }
}

解释:

err.handler.handleConfirm() 通知Web组件继续使用SSL证书。
err.handler.handleCancel() 通知Web组件取消此请求,并根据参数abortLoading决定是否停止加载。

建议:针对证书过期的情况,可以给出一个选择性弹框,提示用户该网站证书过期,存在不安全因素,是否继续加载。

拓展:正对证书验证失败的情况,可以参考: httpRequest.request 请求https接口ssl证书验证失败-网络(Network)-网络-系统开发-开发 - 华为HarmonyOS开发者

网络连接安全配置-应用安全 - 华为HarmonyOS开发者

本地资源替换使用Web组件拦截请求。通过onInterceptRequest拦截请求,将远程资源替换为本地预置内容,规避证书验证。

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

@Component
struct WebPage {
  controller: webview.WebviewController = new webview.WebviewController();

  schemeMap = new Map([
    ["https://your-domain.com/index.html", "local/index.html"],
    ["https://your-domain.com/script.js", "local/script.js"]
  ]);

  build() {
    Column() {
      Web({
        src: "https://your-domain.com/index.html",
        controller: this.controller
      })
      .onInterceptRequest((event) => {
        if (event && this.schemeMap.has(event.request.url)) {
          const localPath = this.schemeMap.get(event.request.url);
          return webview.WebResourceResponse.createWithFilePath(
            localPath,
            "text/html"
          );
        }
        return null;
      })
    }
  }
}

动态加载使用RCP模块跳过验证。通过@kit.RemoteCommunicationKit的SecurityConfiguration配置跳过证书验证,动态获取页面内容后注入Web组件。

import { rcp } from '@kit.RemoteCommunicationKit';
import { webview } from '@kit.ArkWeb';

async function loadUrlWithSkipSSL(url: string): Promise<string> {
  const client = rcp.createHttpClient();
  const config: rcp.HttpClientOptions = {
    securityConfig: {
      remoteValidation: 'skip'
    }
  };
  const request: rcp.HttpRequest = {
    method: rcp.RequestMethod.GET,
    url: url
  };
  const response = await client.request(request, config);
  return response.result.toString();
}

@Component
struct WebComponent {
  controller: webview.WebviewController = new webview.WebviewController();

  build() {
    Column() {
      Web({
        src: $rawfile("blank.html"),
        controller: this.controller
      })
      .onPageBegin(() => {
        loadUrlWithSkipSSL("https://your-domain.com").then(html => {
          this.controller.executeJavaScript(`document.write('${html}')`);
        });
      })
    }
  }
}

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:BV1S4411E7LY/?p=17

import { webview } from '@arkui/web';

@Component
struct WebComponent {
  controller: webview.WebviewController = new webview.WebviewController();

  build() {
    Column() {
      Web({ 
        src: 'https://example.com',
        controller: this.controller 
      })
      .onSslErrorEvent((event: webview.SslErrorEvent) => {
        // 处理SSL错误
        if (event.errorType === webview.SslError.INVALID_CERTIFICATE) {
          event.handler.handleConfirm(); // 确认继续加载
          event.handler.handleCancel(false); // 不中断页面加载
        }
      })
    }
  }
}

参考地址 https://developer.huawei.com/consumer/cn/doc/harmonyos-references/arkts-basic-components-web-sslerrorhandler

在HarmonyOS NEXT中,Web组件默认会验证HTTPS证书。要跳过安全证书验证,需使用onSslErrorEvent回调处理SSL错误。示例代码:

webviewController.onSslErrorEvent((error) => {
  console.log("SSL error occurred, proceed anyway");
  error.handler.handleConfirm(); // 继续加载
});

需在WebController初始化后设置该回调。此操作会降低安全性,仅建议开发调试使用。正式环境应使用有效证书。

在HarmonyOS Next中处理WebView加载HTTPS页面时的证书验证问题,可以通过以下方式解决:

  1. 使用WebView的onReceivedSslError回调方法:
webView.setWebViewClient(new WebViewClient() {
    @Override
    public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
        // 处理SSL错误,继续加载页面
        handler.proceed();
    }
});
  1. 如果需要更细粒度的控制,可以检查证书错误类型:
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
    if (error.getPrimaryError() == SslError.SSL_EXPIRED || 
        error.getPrimaryError() == SslError.SSL_UNTRUSTED) {
        // 仅针对过期或不受信任的证书继续加载
        handler.proceed();
    } else {
        handler.cancel();
    }
}
  1. 对于网络请求,可以使用类似的方式配置:
HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true);

注意事项:

  • 跳过证书验证会降低安全性,建议仅在开发调试阶段使用
  • 生产环境应该使用有效的SSL证书
  • 对于WebView空白页问题,还需要检查是否启用了JavaScript等基本设置,
回到顶部