HarmonyOS 鸿蒙Next中web加载前端页面怎么跳过安全证书验证
HarmonyOS 鸿蒙Next中web加载前端页面怎么跳过安全证书验证
web加载前端页面 显示空白页 我联调也不报错啥的 用手机直接加载这个地址 会出现loading提示 但是鸿蒙直接加载是空白页。手机直接加载地址是 会出现一个当前网站的安全证书已过期或不可信。是不是 web要加载时候跳过安全验证 因为之前发送网络请求 采用了rcp 自定义skip来跳过ssl验证的。遇到这种情况需要怎么解决
【背景知识】
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:
代码如下:
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); // 不中断页面加载
}
})
}
}
}
在HarmonyOS NEXT中,Web组件默认会验证HTTPS证书。要跳过安全证书验证,需使用onSslErrorEvent
回调处理SSL错误。示例代码:
webviewController.onSslErrorEvent((error) => {
console.log("SSL error occurred, proceed anyway");
error.handler.handleConfirm(); // 继续加载
});
需在WebController
初始化后设置该回调。此操作会降低安全性,仅建议开发调试使用。正式环境应使用有效证书。
在HarmonyOS Next中处理WebView加载HTTPS页面时的证书验证问题,可以通过以下方式解决:
- 使用WebView的onReceivedSslError回调方法:
webView.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
// 处理SSL错误,继续加载页面
handler.proceed();
}
});
- 如果需要更细粒度的控制,可以检查证书错误类型:
@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();
}
}
- 对于网络请求,可以使用类似的方式配置:
HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true);
注意事项:
- 跳过证书验证会降低安全性,建议仅在开发调试阶段使用
- 生产环境应该使用有效的SSL证书
- 对于WebView空白页问题,还需要检查是否启用了JavaScript等基本设置,