QT支援https及編譯OpenSSL

索命發表於2020-12-26


搞懂Qt OpenSSL的具體原因

Qt下的https 請求不通的一個重要原因就是缺少OpenSSL的庫,很多網上的內容都直接告訴大家把這兩個庫(libeay32、ssleay32)複製到工程下面這是不負責的回答,一個很重要的原因就是不同版本所需要的OpenSSL的庫的大版本並不相同

  1. Qt自從5.12.4版本所使用的OpenSSL庫的版本是1.1.x,而在這之下的Qt使用的版本是1.0.2系列
  2. 最大的區別是什麼?就是OpenSSL從1.0.2升級成了1.1.x之後,整個動態庫的名字都發生了改變,經典的libeay32.dll和ssleay32.dll搖身一變改名libcrypto-1_1.dll 和libssl-1_1.dll。
  3. 其次就算是Qt 5.12.4以下支援的1.0.2系列庫也並不相同,因為1.0.2包含從a~u這麼多版本,如果你帶入錯誤的1.0.2庫,輕則導致https請求不同,重則程式直接崩潰(親身經歷)

提示:如何找到適合自己的OpenSSL庫並編譯

一、如何找到和自己Qt版本真正合適的庫並編譯

在Qt中通過qDebug()直接輸出

  qDebug()<<QSslSocket::sslLibraryBuildVersionString();
  //輸出對應的OpenSSl庫
  //OpenSSL 1.0.2o  27 Mar 2018

二、編譯自己真正所需的OpenSSL庫

1.下載OpenSSL(以我所需要的1.0.2o為例)

OpenSSL 原始碼歷史版本下載地址
如下所示
歷史版本很多,這裡選擇1.0.2系列
這裡我們下載所需的o版本
下載完成之後我們解壓到當前資料夾即可

2.配置編譯環境及工具ActivePerl

2.1 由於OpenSSLwindows下需要用ActivePerl進行編譯,我們首先下載,

ActivePerl 下載直通車
ActivePerl下載示意
下載後預設安裝完畢就好

2.2 配置Perl環境變數

配置Perl環境變數
最新版預設是新增好的環境變數的
開啟終端,然後直接輸入命令

Perl -help

輸出如下所示就是配置完畢了
Perl配置結果

3.編譯OpenSSL庫

3.1啟動VS2017的命令列終端

  • 不同位數的庫要採用不同的命令列工具
  • 一定要以管理員身份執行

OpenSSL不同位數編譯區別
OpenSSL CMD 管理員啟動

3.2切換到要編譯的OpenSSL 目錄

具體過程 ,如下所示
啟動CMD,切換到工作目錄

3.3 配置要Perl編譯的位數

perl Configure VC-WIN64A no-asm --perfix="E:\\ThirdDLL\\OpenSS_LBuild64"

這裡VC-WIN64A代表目標是64位庫,VC-WIN32 代表是32位庫,no-asm
編譯過程中不使用匯編程式碼加快編譯過程。
配置Perl編譯條件在這裡插入圖片描述

3.4 執行編譯

  • 輸入ms\do_win64a
    輸入ms\do_win64a

  • 輸入nmake -f ms\ntdll.mak(ntdll 代表動態庫,nt 代表靜態庫)
    輸入nmake -f ms\ntdll.mak
    執行完畢如下所示nmake -f ms\ntdll.mak結果

  • 輸入nmake -f ms\ntdll.mak install
    輸入nmake -f ms\ntdll.mak install

  • 輸入nmake -f ms\ntdll.mak test 進行測試
    輸入nmake -f ms\ntdll.mak test
    最終結果
    nmake -f ms\ntdll.mak test結果

  • 編譯命令彙總

perl Configure VC-WIN64A no-asm --perfix="E:\\ThirdDLL\\OpenSSL_Build64"
ms\do_win64a
nmake -f ms\ntdll.mak
nmake -f ms\ntdll.mak install
nmake -f ms\ntdll.mak test

總結

以上截圖及操作均有本人實際操作完成

相關文章