Qt中使用OpenSSL
概述
OpenSSL官網
- OpenSSL官網:OpenSSL是一個開源跨平臺的加密庫,應用廣泛。Windows提供了自己的一套加密認證API,感興趣的話可以參考:Windows Authentication Overview。
Qt官方文檔:
- Secure Sockets Layer (SSL) Classes
- Adding OpenSSL Support
- Adding OpenSSL Support for Android
網站內容為英文,閱讀起來需要一些耐心。其中比較重要的信息有兩點:
- Qt使用了OpenSSL,但是因為地區法律規定的原因,在Qt安裝包里面并沒有包含OpenSSL,需要用的話,在遵守法律的前提下,自己編譯安裝,并對你的軟件合法分發。
這里說的“法律”,OpenSSL官網在首頁最下方對其進行了描述(來自必應翻譯):
請記住,在世界某些地區,進出口和/或使用強大的加密軟件、提供加密鉤,甚至只是傳達有關加密軟件的技術細節都是非法的。因此,當您將此包導入您的國家/地區時,請重新分發,甚至只是通過電子郵件向作者或其他人發送技術建議,甚至提供補丁,因此強烈建議您密切關注適用于您的任何法律或法規。OpenSSL 的作者對您在此處做出的任何違規行為不承擔責任。所以要小心,這是你的責任。
- 默認情況下,Qt在運行時動態加載OpenSSL,也就是說,如果能找到對應版本的OpenSSL庫,相關模塊就支持SSL通信,否則就不支持。
Qt中哪些地方用到了OpenSSL
https
所屬模塊:QT += network
使用QNetworkAccessManager進行https訪問時,需要使用OpenSSL,通過以下代碼可以打印出QNetworkAccessManager當前可用的協議。
QNetworkAccessManager *manager = new QNetworkAccessManager(this); qDebug() << manager->supportedSchemes();如果輸出中沒有"https",說明OpenSSL未配置,配置方法見下文。
Qt SSL Classes
所屬模塊:QT += network
Qt的SSL系列類使用OpenSSL實現,所以依賴OpenSSL庫。可以使用以下代碼打印查看當前版本的Qt依賴哪個版本的OpenSSL:
qDebug() << QSslSocket::sslLibraryBuildVersionString();自己下載安裝OpenSSL
下載安裝有兩種方式:
通過源碼編譯,直接在官網下載源碼編譯即可,優點是安全,全版本都有,缺點是費事。具體步驟參考:
QT支持https及編譯OpenSSL。
使用第三方編譯好的安裝包:優點是省事,缺點是無法確定發布者是否可靠、版本不全。具體步驟參考:Qt連接https :解決OpenSSL問題。
關于libeay32.dll和ssleay32.dll
可能讀者在搜索資料的過程中,發現有的地方說要拷貝libeay32.dll和ssleay32.dll,有的地方說要拷貝libssl-1_1.dll和libcrypto-1_1.dll。到底需要哪個?還是兩者都要?
答案在OpenSSL git倉庫日志中,找到分支OpenSSL-1_1_0-stable,查看日志,在以下提交中有對應的描述:
SHA-1: 6928b6171ada6d0de5a024a188dc7a68094d2dca * Change names of ordinals and libs, libeay => libcrypto and ssleay => libssl Reviewed-by: Rich Salz <rsalz@openssl.org>也就是說,
- libeay32.dll和ssleay32.dll是OpenSSL v1.1.0之前版本才有的庫。
- 從OpenSSL v1.1.0開始,libeay32.dll=>libcrypto,ssleay32.dll=>libssl。
關于SSL漏洞
舊版本的OpenSSL庫存在漏洞,如“心臟滴血”漏洞,詳細描述見OpenSSL漏洞列表。所以要盡量使用已知安全的、穩定的OpenSSL版本。對于Qt來說,也要使用新的Qt版本。
但是,如果在Qt版本確定的情況下,此版本的Qt使用的OpenSSL版本也是確定的。如果此版本的OpenSSL存在漏洞怎么辦?
1. 使用此分支的穩定版本
以Qt5.5.1 msvc2013 32位為例,其依賴的OpenSSL版本為:OpenSSL 1.0.2g 1 Mar 2016。在 OpenSSL官網更新日志 中可以找到此版本的更新描述。
接著,在 OpenSSL的Git倉庫 中,將其克隆到本地后查看版本分支圖,可以看到OpenSSL 1.0.2g所在分支為OpenSSL_1_0_2-stable,此分支最新版本為OpenSSL 1.0.2u。因為它們屬于同一個大版本,所以可以使用此版本的OpenSSL嘗試,這里僅提供一個思路,筆者目前未嘗試。
再以Qt 5.12.11為例,此版本使用的OpenSSL版本為OpenSSL 1.1.1g 21 Apr 2020。直接安裝使用最新的OpenSSL v1.1.1l能夠正常運行。
2. 更換版本分支
截至目前,根據官網描述,v1.1.1以前的版本將不做更新,也就是說,v1.1.1之前的版本就算有重大Bug也不會修復了(除非付費支持)。在這種情況下,只有更換新的OpenSSL分支了。更換OpenSSL分支一般需要更換Qt版本。
3. 使用第三方SSL通信庫
可能因為某種原因,項目中無法更換Qt版本。解決此問題是方法是,使用第三方網絡通信庫,如:
- libcurl:libcurl on github地址,libcurl可以基于較新的OpenSSL編譯,從而實現https訪問。如需要實現SSL Socket,可以查找第三方庫或自己實現。
結語
至此我們對Qt中使用OpenSSL有了初步的了解,更加深入的內容后續會不斷更新,敬請期待。
本文原創首發自微信公眾號:Qt未來工程師。
總結
以上是生活随笔為你收集整理的Qt中使用OpenSSL的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《暗黑破坏神:不朽》国服跳票:新上线时间
- 下一篇: Angular 自定义属性指令-禁止in