鸿蒙3.0WebView网络错误问题

背景,荣耀9x,混淆才会出这个问题。

[ERROR:ssl_client_socket_impl.cc(981)] handshake failed; returned -1, SSL error code 1, net_error -2

NetError.java

int SSLClientSocketImpl::DoHandshake() {crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE);int rv = SSL_do_handshake(ssl_.get());int net_error = OK;if (rv <= 0) {int ssl_error = SSL_get_error(ssl_.get(), rv);if (ssl_error == SSL_ERROR_WANT_X509_LOOKUP && !send_client_cert_) {return ERR_SSL_CLIENT_AUTH_CERT_NEEDED;}if (ssl_error == SSL_ERROR_WANT_PRIVATE_KEY_OPERATION) {DCHECK(client_private_key_);DCHECK_NE(kSSLClientSocketNoPendingResult, signature_result_);next_handshake_state_ = STATE_HANDSHAKE;return ERR_IO_PENDING;}if (ssl_error == SSL_ERROR_WANT_CERTIFICATE_VERIFY) {DCHECK(cert_verifier_request_);next_handshake_state_ = STATE_HANDSHAKE;return ERR_IO_PENDING;}OpenSSLErrorInfo error_info;net_error = MapLastOpenSSLError(ssl_error, err_tracer, &error_info);if (net_error == ERR_IO_PENDING) {// If not done, stay in this statenext_handshake_state_ = STATE_HANDSHAKE;return ERR_IO_PENDING;}LOG(ERROR) << "handshake failed; returned " << rv << ", SSL error code "<< ssl_error << ", net_error " << net_error;NetLogOpenSSLError(net_log_, NetLogEventType::SSL_HANDSHAKE_ERROR,net_error, ssl_error, error_info);}next_handshake_state_ = STATE_HANDSHAKE_COMPLETE;return net_error;
}
int SSLClientSocketImpl::MapLastOpenSSLError(int ssl_error,const crypto::OpenSSLErrStackTracer& tracer,OpenSSLErrorInfo* info) {int net_error = MapOpenSSLErrorWithDetails(ssl_error, tracer, info);if (ssl_error == SSL_ERROR_SSL &&ERR_GET_LIB(info->error_code) == ERR_LIB_SSL) {// TLS does not provide an alert for missing client certificates, so most// servers send a generic handshake_failure alert. Detect this case by// checking if we have received a CertificateRequest but sent no// certificate. See https://crbug.com/646567.if (ERR_GET_REASON(info->error_code) ==SSL_R_SSLV3_ALERT_HANDSHAKE_FAILURE &&certificate_requested_ && send_client_cert_ && !client_cert_) {net_error = ERR_BAD_SSL_CLIENT_AUTH_CERT;}// Per spec, access_denied is only for client-certificate-based access// control, but some buggy firewalls use it when blocking a page. To avoid a// confusing error, map it to a generic protocol error if no// CertificateRequest was sent. See https://crbug.com/630883.if (ERR_GET_REASON(info->error_code) == SSL_R_TLSV1_ALERT_ACCESS_DENIED &&!certificate_requested_) {net_error = ERR_SSL_PROTOCOL_ERROR;}// This error is specific to the client, so map it here.if (ERR_GET_REASON(info->error_code) ==SSL_R_NO_COMMON_SIGNATURE_ALGORITHMS) {net_error = ERR_SSL_CLIENT_AUTH_NO_COMMON_ALGORITHMS;}}return net_error;
}
int MapOpenSSLErrorWithDetails(int err,const crypto::OpenSSLErrStackTracer& tracer,OpenSSLErrorInfo* out_error_info) {*out_error_info = OpenSSLErrorInfo();switch (err) {case SSL_ERROR_WANT_READ:case SSL_ERROR_WANT_WRITE:return ERR_IO_PENDING;case SSL_ERROR_EARLY_DATA_REJECTED:return ERR_EARLY_DATA_REJECTED;case SSL_ERROR_SYSCALL:PLOG(ERROR) << "OpenSSL SYSCALL error, earliest error code in ""error queue: "<< ERR_peek_error();return ERR_FAILED;case SSL_ERROR_SSL:// Walk down the error stack to find an SSL or net error.while (true) {OpenSSLErrorInfo error_info;error_info.error_code =ERR_get_error_line(&error_info.file, &error_info.line);if (error_info.error_code == 0) {// Map errors to ERR_SSL_PROTOCOL_ERROR by default, reporting the most// recent error in |*out_error_info|.return ERR_SSL_PROTOCOL_ERROR;}*out_error_info = error_info;if (ERR_GET_LIB(error_info.error_code) == ERR_LIB_SSL) {return MapOpenSSLErrorSSL(error_info.error_code);}if (ERR_GET_LIB(error_info.error_code) == OpenSSLNetErrorLib()) {// Net error codes are negative but encoded in OpenSSL as positive// numbers.return -ERR_GET_REASON(error_info.error_code);}}default:// TODO(joth): Implement full mapping.LOG(WARNING) << "Unknown OpenSSL error " << err;return ERR_SSL_PROTOCOL_ERROR;}
}

只有MapOpenSSLErrorWithDetails能返回-2,所以是openssl返回的错误。

抓包对比报文的差异:

似乎是客户端不识别证书。

没有思路,使用二分试错法。

结果:keep bouncycastle库可以解决问题,之前没有keep这个库却移除了系统实现。

问题代码:

//set up the security provider
private fun setupBouncyCastle() {// Web3j will set up a provider  when it's used for the first time.val provider = Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) ?: returnif (provider.javaClass == BouncyCastleProvider::class.java) {return}//There is a possibility  the bouncy castle registered by android may not have all ciphers//so we  substitute with the one bundled in the app.Security.removeProvider(BouncyCastleProvider.PROVIDER_NAME)Security.insertProviderAt(BouncyCastleProvider(), 1)
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/37656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Oracle新特性速递:未来数据库技术的无限可能

文章目录 一、自治数据库&#xff1a;智能化与自动化的革命二、机器学习集成&#xff1a;智能数据分析的新境界三、区块链技术&#xff1a;确保数据完整性与透明性四、云原生数据库&#xff1a;灵活扩展与快速部署五、人工智能优化器&#xff1a;智能查询执行计划《Oracle从入门…

centos7搭建zookeeper 集群 1主2从

centos7搭建zookeeper 集群 准备前提规划防火墙开始搭建集群192.168.83.144上传安装包添加环境变量修改zookeeper 的配置 192.168.83.145 和 192.168.83.146 配置 启动 集群 准备 vm 虚拟机centos7系统zookeeper 安装包FinalShell或者其他shell工具 前提 虚拟机安装好3台cen…

为什么我的Skype点数不见了?如何重新激活 Skype 点数?

您超过180天没有使用过点数打电话功能&#xff0c;点数暂时封存在您的账户里面&#xff0c;需要您手动激活&#xff08;目前必须要登录网页版skype&#xff09; 可再次使用。 如何重新激活 Skype 点数&#xff1f; 登录到你的帐户 . 选择 重新激活信用额度 .注意&#xff1a; …

MiniTest

1.编辑case文件first_test.py import minium class FirstTest(minium.MiniTest): def test_get_system_info(self): 2.编辑配置文件config.json { "project_path": "path/to/project", "dev_tool_path": "path/to/cli", "…

【Python】 Joblib:高效的Python作业调度和缓存工具

那年夏天我和你躲在 这一大片宁静的海 直到后来我们都还在 对这个世界充满期待 今年冬天你已经不在 我的心空出了一块 很高兴遇见你 让我终究明白 回忆比真实精彩 &#x1f3b5; 王心凌《那年夏天宁静的海》 在Python数据科学和机器学习中&#xff0c;处理…

喜讯!安全狗荣获“2023年网络安全技术支撑优秀单位”称号

6月6日&#xff0c;由中共厦门市委网络安全和信息化委员会办公室&#xff08;以下简称“厦门市委网信办”&#xff09;主办的2023年网络安全技术支撑优秀单位颁奖仪式在厦门成功举行。 作为国内云原生安全领导厂商&#xff0c;安全狗受邀出席此次活动。 会上&#xff0c;安全狗…

预约小程序源码,云开发技术,无需服务器

介绍&#xff1a; 很多企业的业务都需要通过服务预约来完成&#xff0c;比如酒店、美容、家政等等。 但很多商家因缺少合适的服务预订工具&#xff0c;而不知道如何让客户尽快预约。 这种情况下&#xff0c;制作一个自己的预约小程序&#xff0c;客户只需要扫码或者在微信里…

Eureka的桥梁:服务消费者交互全解析

Eureka的桥梁&#xff1a;服务消费者交互全解析 在微服务架构中&#xff0c;服务发现是确保服务间有效通信的关键机制。Eureka&#xff0c;作为Netflix开源的服务发现框架&#xff0c;扮演着服务注册中心的角色&#xff0c;为服务消费者和服务提供者提供了一个动态的服务注册与…

调用基类的纯虚函数,如何知道纯虚函数会调用哪个派生类(子类)中的实现。

在 C 中&#xff0c;调用基类的纯虚函数实际上是通过运行时多态性来决定调用哪一个派生类的实现。这种机制是通过虚函数表&#xff08;vtable&#xff09;和虚函数指针&#xff08;vptr&#xff09;实现的。下面我们来详细探讨一下这个过程。 虚函数表和虚函数指针 虚函数表&a…

开放签电子签章系统(企业版)V2.0.5版本详细更新内容

本次版本迭代间隔1月之久&#xff0c;新功能主要是增加文件的签署记录并生成报告&#xff0c;其次优化支持非A4规格的签约文件&#xff08;这个费时很久&#xff0c;主要原因是推翻之前的位置计算的逻辑&#xff0c;重新计算坐标位置&#xff09;&#xff0c;详细更新内容如下&…

WebKit与CSSOM视图模块:探索现代Web布局的协同进化

WebKit与CSSOM视图模块&#xff1a;探索现代Web布局的协同进化 在当今快速发展的Web技术领域&#xff0c;WebKit作为众多流行浏览器的渲染引擎&#xff0c;其对CSS对象模型&#xff08;CSSOM&#xff09;视图模块的支持至关重要。CSSOM视图模块为开发者提供了一组丰富的API&am…

HarmonyOS--开发者证书地址

初级证书&#xff1a;华为开发者学堂 高级证书&#xff1a;华为开发者学堂

【Qt】QSettings使用

1. 介绍 QSettings类提供持久的跨平台的应用程序设置存储。 2. 使用 /*********************************************************/ /* main.cpp */ int main(int argc, char *argv[]) {QApplication a(argc, argv);//Settings设置a.setOrganizationName("custom"…

【笔记】通过shell脚本自动部署项目(未完成)

然后将gitee仓库上的代码克隆至linux上 如果不知道gitee仓库怎么上传代码移步【笔记】如何在gitee仓库上传idea代码-CSDN博客 写到一半不想写了自己去复习p138-139吧

【0基础学爬虫】爬虫基础之scrapy的使用

【0基础学爬虫】爬虫基础之scrapy的使用 大数据时代&#xff0c;各行各业对数据采集的需求日益增多&#xff0c;网络爬虫的运用也更为广泛&#xff0c;越来越多的人开始学习网络爬虫这项技术&#xff0c;K哥爬虫此前已经推出不少爬虫进阶、逆向相关文章&#xff0c;为实现从易到…

武汉星起航:亚马逊精选,中国卖家打造的时尚防雨装备推荐

炎炎夏日&#xff0c;突如其来的雨水成为了许多城市居民的“常客”。在这样的季节里&#xff0c;一套时尚又实用的防雨装备成为了人们出行的必备之选。中国卖家在亚马逊上的防雨装备选品&#xff0c;凭借其精湛的工艺和独特的设计理念&#xff0c;成为了消费者们的首选。 首先…

云端企业协同:iCloud与企业应用集成全攻略

云端企业协同&#xff1a;iCloud与企业应用集成全攻略 在数字化转型的浪潮中&#xff0c;企业应用正迅速迁移到云端&#xff0c;以提高效率、降低成本并增强竞争力。iCloud作为苹果公司提供的云服务&#xff0c;不仅深受个人用户喜爱&#xff0c;也为企业提供了一系列强大的集…

选哪个短剧系统源码好:全面评估与决策指南

在短剧内容创作和分享日益流行的今天&#xff0c;选择合适的短剧系统源码对于构建一个成功的短剧平台至关重要。短剧系统源码不仅关系到平台的稳定性和用户体验&#xff0c;还直接影响到内容创作者和观众的互动质量。本文将提供一份全面的评估指南&#xff0c;帮助您在众多短剧…

CesiumJS【Basic】- #037 绘制轮廓线(Entity方式)

文章目录 绘制轮廓线(Entity方式)1 目标2 代码2.1 main.ts绘制轮廓线(Entity方式) 1 目标 使用Entity方式绘制轮廓线 2 代码 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium.Viewer(<