qt 嵌入web頁面_Qt嵌入瀏覽器(三)——QWebEngine與Https

本篇簡介:

本篇的小目標:

挑戰通過Qt WebEngine實現與服務端的Https雙向認證

雙向認證,Qt WebEngine和Chromium

這里先說結論:挑戰失敗了。至少使用Qt WebEngine目前已實現的組件沒有辦法直接實現雙向認證。

先來簡要分析一下實現雙向認證需要做些什么。首先,服務端和客戶端——客戶端也就是我們的定制瀏覽器——各自需要向對方提供自己的安全證書,并檢查對方所提供的安全證書是否在自己的信任庫中。Qt提供了設置這樣的安全環境的組件QSslConfiguration,普通的加密通信如果要實現雙向認證,可以很方便地使用這個組件完成客戶端證書和信任庫的設置(具體可以參考我的另一篇文章:QSslSocket雙向認證設置)。

然而比較坑的地方是,就目前的5.10版而言,Qt WebEngine并不能直接載入QSslConfiguration里的設置。因為使用了Chromium作為內核,WebEngine在加載頁面時走的是Chromium自己的一條網絡棧,并沒使用Qt的安全環境設置。而Chromium在處理Https請求時,默認是直接讀取操作系統中設置的證書作為客戶端自己的安全證書,現有版本的WebEngine對此沒有進行更改。更坑的地方是,Chromium本身是提供了選擇客戶端證書的接口的,在使用Chrome瀏覽器第一次訪問需要認證客戶端的https頁面時,會彈出一個選擇客戶端證書的框,如下圖所示:

certselect.png

而WebEngine似乎會直接略過客戶端證書的加載。這個bug已經被提交到了官方,已經有相應的補丁出爐,但是要整合到發布版里可能要等到Qt5.12版本了,具體可參考:WebEngine無法載入客戶端證書的bug report。

上面所說的這個bug,直接導致了服務端無法對客戶端進行安全認證。因此就現有版本而言,是無法直接通過使用WebEngine來實現https雙向認證的。在Qt源碼中打上上面鏈接中的補丁并重新編譯Qt的話應該可以一定程度解決這個問題,這里我就不進行進一步的嘗試了。

那么反過來,客戶端可以認證服務端證書嗎?承前所述,因為WebEngine無法直接載入QSslConfiguration里的設置,同時也沒有提供查詢服務端證書信息的接口,因此客戶端也無法直接認證服務端的證書。

迂回路線?

那么,有沒有辦法繞過上面說的這些坑呢?當然有,那就是不使用WebEngine的load,而使用Qt自己的QNetworkAccessManager訪問頁面,然后將返回數據通過WebEngineView的各種setter(例如setHtml)控制WebEngine對頁面進行加載。這種方式比較繁瑣,可能會適用于某些僅訪問較為固定頁面的系統。但是這和我在這個系列開篇所講的理念就不是非常相符了,因此在這里就不展開分析了。

不用雙向認證的https?

這里再把問題簡化一下:如果服務端和客戶端不需要進行相互認證,只是希望通信是加密呢?這其實實現起來就和普通的http訪問沒有太大的區別了。

這里只稍微分析下一種比較常見的情況:服務端的證書不受信任。我們在使用chrome瀏覽器訪問證書不受信任的https網站時,會彈出“您的鏈接不是私密鏈接”的提示頁面,然后可以通過選擇繼續前往強制訪問。而WebEngine默認的實現則會直接ban掉這次訪問,并沒有提供強制訪問的選項。

好在這次WebEnginePage里提供了certificateError方法可以解決這個問題。只需要實現一個WebEnginePage的子類,并重載certificateError,就可以選擇性地忽略一些證書錯誤。下面的實現里忽略了證書不受信任的錯誤,供大家參考:

QList<:error> QSslPage::m_allowedError =

QList<:error>()

<< QWebEngineCertificateError::Error::CertificateAuthorityInvalid;

SslPage::SslPage(QObject* parent) : QWebEnginePage(parent)

{

}

bool SslPage::certificateError(const QWebEngineCertificateError& certificateError)

{

if (m_allowedError.contains(certificateError.error()))

{

return true;

}

else

{

qDebug() << "[cert error]" << certificateError.errorDescription();

return QWebEnginePage::certificateError(certificateError);

}

}

其中m_allowedError是靜態成員變量。

總結

我最初開始嘗試使用WebEngine是差不多兩年前,那個時候Qt還是5.6的版本,上面所說的Https的問題自不用說,還存在上篇文章里提到的WebChannel的嚴重bug。所以最終無奈之下,我放棄了WebEngine而采用了更底層的CEF進行開發。希望在Qt的后續版本里,WebEngine的種種問題能得以改善——畢竟是Qt自家的組件,使用起來還是更便利一些的。

寫到這里,我個人有關WebEngine的整理也進行的差不多了。下一篇開始介紹Qt整合CEF實現定制化瀏覽器的方案。

參考鏈接

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373814.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373814.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373814.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python模塊;opencv安裝

http://www.lfd.uci.edu/~gohlke/pythonlibs/ 1. 步驟1. 下載Python2.73, 安裝, 并配置Python環境變量:".\Program Files\Python27;";注意: OpenCV僅支持2.6&2.7, Python不能使用3.x版本;2. 下載OpenCV2.46, 安裝, 并配置OpenCV環境變量:".\Program Files\o…

Java中的正則表達式–軟介紹

正則表達式是一種可以應用于文本&#xff08;Java中的String&#xff09;的模式。 Java提供了java.util.regex包&#xff0c;用于與正則表達式進行模式匹配。 Java正則表達式與Perl編程語言非常相似&#xff0c;并且非常易于學習。 正則表達式匹配文本&#xff08;或文本的一部…

AJAX入門——工作原理

理解同步交互和異步交互 舉個例子&#xff1a;普通B/S模式(同步) AJAX技術(異步) * 同步&#xff1a; 提交請求->等待服務器處理->處理完畢返回 這個期間客戶端瀏覽器不能干任何事。 發送方發出數據后&#xff0c;等接收方發回響應以后才發下一個數據包的…

Couldn’t communicate with a helper application.

出現此問題 的情景 我在提交svn之前&#xff0c;在Xcode中的Images.xcassets里添加了文件夾后又刪除了&#xff0c; 但是 在Xcode中提交的時候&#xff0c;左側勾選文件那一欄中 出現了此文件夾及里邊的文件。 解決&#xff1a; 我在conerstore中將此文件夾 remove后&#xff0…

python 復制文件夾內容 并結構一致_Python比較文件夾比另一同名文件夾多出的文件并復制出來的方法...

本文實例講述了Python比較文件夾比另一同名文件夾多出的文件并復制出來的方法。分享給大家供大家參考。具體如下&#xff1a;這個東東本來是做來給公司數據同步用的&#xff1a;新服務器還沒正式啟用&#xff0c;舊的服務器還在使用&#xff0c;每天都有大量圖片傳到舊服務器上…

css控制頁面文字不能被選中user-select:none;

現象&#xff1a;html中可能有些地方不想讓用戶復制文字&#xff0c;或是用a標簽做了個點擊按鈕&#xff0c;點快的時候文字會被選中&#xff0c;很丑&#xff0c;這個時候可以使用下面的方案禁止文字選中。原因&#xff1a;鼠標點快了文字會被選中。解決方案&#xff1a;不同的…

form表單標簽的enctype屬性的作用

Enctype是指定將數據回發到服務器時瀏覽器使用的編碼類型&#xff0c;其編碼類型有以下三種 一、 application/x-www-form-urlencoded 這是通過表單發送數據時默認的編碼類型。我們沒有在from標簽中設置enctype屬性時默認就是application/x-www-form-urlencoded類型的。…

重溫“ Java Sucks”

總覽 關于Java的不足之處&#xff08;從C開發人員的角度來看&#xff09;的一個有趣的文檔是在一段時間&#xff08;大約2000年前&#xff09;寫的&#xff0c;但是今天許多論點都像十年前一樣真實&#xff08;或不真實&#xff09;。 原始的Java Sucks發布。 短消息回顧 Ja…

Android Studio IDE Out of Memory

場景&#xff1a; 嘗試過各種方式&#xff0c;IDE重裝&#xff0c;重新啟動&#xff0c;設置IDE MEMORY大小JDK MEMORY大小都無效 終于在FILE->INVALIDATE CACHES/RESTART 中點擊重新啟動之后問題攻克了。轉載于:https://www.cnblogs.com/yxwkf/p/5128094.html

git 忽略 部分文件夾_git設置忽略文件和目錄

1.登錄gitbash命令端進入本地git庫目錄AdministratorPC201601200946 MINGW32 /d/gitrespository/crmweb (master)2.創建.gitignore3.修改文件&#xff0c;添加忽略正則.idea //忽略.idea文件夾及文件夾下文件*.iml //忽略以.iml結尾的文件【例子】# 忽略*.o和*.a文件*.[oa]# 忽…

在Spring MVC REST應用程序中自動生成WADL

上一次我們學習了WADL的基礎知識 。 語言本身并沒有那么有趣&#xff0c;只寫了一篇有關它的文章&#xff0c;但是本文的標題揭示了為什么我們需要這些知識。 JSR 311的許多實現&#xff1a;JAX-RS&#xff1a;RESTful Web服務的Java API提供了開箱即用的運行時WADL生成&#x…

JSP靜態導入與動態導入

JSP靜態導入&#xff08;JSP指令標記include&#xff09; JSP頁面第一次被請求時&#xff0c;會被JSP引擎轉譯成Servlet的Java文件&#xff0c;然后再被編譯成字節碼文件執行。JSP指令標記為JSP頁面轉譯提供整個頁面的相關信息。 include指令用于在JSP頁面靜態插入一個文件&…

關于DJANGO和JAVASCRIPT的時間

最近&#xff0c;實際一些簡單統計時&#xff0c;要到庫里去檢索數據出來用HIGHCHARTS畫圖&#xff0c; 作一個簡單的回照。。 DJANGO用TEMPLATEVIEW來作。專業&#xff0c;正規&#xff1a;&#xff09; class SAView(TemplateView):template_name version/sa_site.htmlpagin…

git里面的文件怎么刪不掉_.git目錄刪不掉

這樣的情況并非是第一次遇到了&#xff0c;以前總是會覺得這樣的問題只是電腦的錯亂&#xff0c;重啟一下電腦就好了&#xff0c;但是并非每次都需要重啟電腦的&#xff0c;其實簡單的設置一下&#xff0c;這個問題就可以解決了。對了&#xff0c;咱們還是說說這到底是個什么問…

集成框架比較– Spring集成,Mule ESB或Apache Camel

公司之間的數據交換增加了很多。 必須集成的應用程序數量也增加了。 這些接口使用不同的技術&#xff0c;協議和數據格式。 但是&#xff0c;這些應用程序的集成應以標準化的方式建模&#xff0c;有效實現并由自動測試支持 。 JVM環境中提供了三個可滿足這些要求的集成框架&…

Vue.js組件學習

組件可以擴展HTML元素&#xff0c;封裝可重用的HTML代碼&#xff0c;我們可以將組件看作自定義的HTML元素。組件系統提供了一種抽象&#xff0c;讓我們可以使用獨立可復用的小組件來構建大型應用。 一個簡單組件例子(全局注冊&#xff09; <!DOCTYPE html> <html>&…

Winform MD5

1&#xff1a;MD5 http://www.cmd5.com/ 字節數組----字符串 //將字節數組中每個元素按照指定的編碼格式解析成字符串//直接將數組ToString()//將字節數組中的每個元素ToString() //ToString("Params") ToString("x") //可以將十進制字符串轉換為16進制字符…

HTML元素顯示與隱藏

在WEB開發中&#xff0c;前臺HTML中經常需要控制元素的隱藏與顯示&#xff0c;我們最為最常見是二級導航欄&#xff08;通過鼠標的移動來觸發onmouseover&#xff0c;onmouseout事件來實現二級菜單的顯示與隱藏&#xff09;二級菜單的顯示與隱藏。 然而控制元素的影響與顯示有…

書評:JavaFX 2.0:示例介紹

盡管Oracle在JavaOne 2010和JavaOne 2011上對JavaFX的更改使我從懷疑論者轉變為對JavaFX的信奉者 &#xff0c;但是JavaFX愿景的轉變并非沒有缺點 。 特別是&#xff0c;JavaFX圖書市場一直很棘手&#xff0c;因為幾乎所有可用的JavaFX圖書都與1.x版本有關。 在這篇文章中&…

腦子越來越不好使,文字越來越像馱shi

沒辦法&#xff0c;還是記下來。。。轉載于:https://www.cnblogs.com/thorlet/p/5926595.html