鴻蒙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.pswp.cn/web/37656.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/37656.shtml
英文地址,請注明出處:http://en.pswp.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(<