Qt開發筆記:OpenSSL庫介紹、windows上mingw32版本的OpenSSL編譯模組化

紅胖子(紅模仿)發表於2021-06-03

前言

  Windows上mingw32版本的openssl的編譯是屬於比較棘手的,OpenSSL本身不提供支援.。

 

OpenSSL

介紹

  OpenSSL是一個開放原始碼的軟體庫包,應用程式可以使用這個包來進行安全通訊,避免竊聽,同時確認另一端連線者的身份。這個包廣泛被應用在網際網路的網頁伺服器上。
  SSL是Secure Sockets Layer(安全套接層協議)的縮寫,可以在Internet上提供祕密性傳輸。Netscape公司在推出第一個Web瀏覽器的同時,提出了SSL協議標準。其目標是保證兩個應用間通訊的保密性和可靠性,可在伺服器端和使用者端同時實現支援。已經成為Internet上保密通訊的工業標準。
  SSL能使使用者/伺服器應用之間的通訊不被攻擊者竊聽,並且始終對伺服器進行認證,還可選擇對使用者進行認證。SSL協議要求建立在可靠的傳輸層協議(TCP)之上。SSL協議的優勢在於它是與應用層協議獨立無關的,高層的應用層協議(例如:HTTP,FTP,TELNET等)能透明地建立於SSL協議之上。SSL協議在應用層協議通訊之前就已經完成加密演算法、通訊金鑰的協商及伺服器認證工作。在此之後應用層協議所傳送的資料都會被加密,從而保證通訊的私密性。

特點

安全通道特性

  • 資料保密性
      資訊加密就是把明碼的輸入檔案用加密演算法轉換成加密的檔案以實現資料的保密。加密的過程需要用到金鑰來加密資料然後再解密。沒有了金鑰,就無法解開加密的資料。資料加密之後,只有金鑰要用一個安全的方法傳送。加密過的資料可以公開地傳送。
  • 資料完整性
      加密也能保證資料的一致性。例如:訊息驗證碼(MAC),能夠校驗使用者提供的加密資訊,接收者可以用MAC來校驗加密資料,保證資料在傳輸過程中沒有被篡改過。
  • 安全驗證
      加密的另外一個用途是用來作為個人的標識,使用者的金鑰可以作為他的安全驗證的標識。SSL是利用公開金鑰的加密技術(RSA)來作為使用者端與伺服器端在傳送機密資料時的加密通訊協定。
      OpenSSL包含一個命令列工具用來完成OpenSSL庫中的所有功能,更好的是,它可能已經安裝到你的系統中了。
      OpenSSL是一個強大的安全套接字層密碼庫,Apache使用它加密HTTPS,OpenSSH使用它加密SSH,但是,你不應該只將其作為一個庫來使用,它還是一個多用途的、跨平臺的密碼工具。

開源特點

  Eric A. Young和Tim J. Hudson自1995年開始編寫後來具有巨大影響的OpenSSL軟體包,這是一個沒有太多限制的開放原始碼的軟體包。Eric A. Young 和Tim J. Hudson是加拿大人,後來由於寫OpenSSL功成名就之後就到大公司裡賺大錢去了。1998年,OpenSSL專案組接管了OpenSSL的開發工作,並推出了OpenSSL的0.9.1版,到目前為止,OpenSSL的演算法已經非常完善,對SSL2.0、SSL3.0以及TLS1.0都支援。
  OpenSSL採用C語言作為開發語言,這使得OpenSSL具有優秀的跨平臺效能,這對於廣大技術人員來說是一件非常美妙的事情,可以在不同的平臺使用同樣熟悉的東西。OpenSSL支援Linux、Windows、BSD、Mac、VMS等平臺,這使得OpenSSL具有廣泛的適用性。但習慣C語言總比使用C++重新寫一個跟OpenSSL相同功能的軟體包輕鬆不少。

功能

基本功能

  OpenSSL整個軟體包大概可以分成三個主要的功能部分:SSL協議庫、應用程式以及密碼演算法庫。OpenSSL的目錄結構自然也是圍繞這三個功能部分進行規劃的。
  作為一個基於密碼學的安全開發包,OpenSSL提供的功能相當強大和全面,囊括了主要的密碼演算法、常用的金鑰和證書封裝管理功能以及SSL協議,並提供了豐富的應用程式供測試或其它目的使用。

輔助功能

  BIO機制是OpenSSL提供的一種高層IO介面,該介面封裝了幾乎所有型別的IO介面,如記憶體訪問、檔案訪問以及Socket等。這使得程式碼的重用性大幅度提高,OpenSSL提供API的複雜性也降低了很多。
  OpenSSL對於隨機數的生成和管理也提供了一整套的解決方法和支援API函式。隨機數的好壞是決定一個金鑰是否安全的重要前提。
  OpenSSL還提供了其它的一些輔助功能,如從口令生成金鑰的API,證書籤發和管理中的配置檔案機制等等。如果你有足夠的耐心,將會在深入使用OpenSSL的過程慢慢發現很多這樣的小功能,讓你不斷有新的驚喜。

演算法

金鑰證書管理

  金鑰和證書管理是PKI的一個重要組成部分,OpenSSL為之提供了豐富的功能,支援多種標準。
  首先,OpenSSL實現了ASN.1的證書和金鑰相關標準,提供了對證書、公鑰、私鑰、證書請求以及CRL等資料物件的DER、PEM和BASE64的編解碼功能。OpenSSL提供了產生各種公開金鑰對和對稱金鑰的方法、函式和應用程式,同時提供了對公鑰和私鑰的DER編解碼功能。並實現了私鑰的PKCS#12和PKCS#8的編解碼功能。OpenSSL在標準中提供了對私鑰的加密保護功能,使得金鑰可以安全地進行儲存和分發。
  在此基礎上,OpenSSL實現了對證書的X.509標準編解碼、PKCS#12格式的編解碼以及PKCS#7的編解碼功能。並提供了一種文字資料庫,支援證書的管理功能,包括證書金鑰產生、請求產生、證書籤發、吊銷和驗證等功能。
  事實上,OpenSSL提供的CA應用程式就是一個小型的證書管理中心(CA),實現了證書籤發的整個流程和證書管理的大部分機制。
  OpenSSL實現了SSL協議的SSLv2和SSLv3,支援了其中絕大部分演算法協議。 OpenSSL也實現了TLSv1.0,TLS是SSLv3的標準化版,雖然區別不大,但畢竟有很多細節不盡相同。
  雖然已經有眾多的軟體實現了OpenSSL的功能,但是OpenSSL裡面實現的SSL協議能夠讓我們對SSL協議有一個更加清楚的認識,因為至少存在兩點:一是OpenSSL實現的SSL協議是開放原始碼的,我們可以追究SSL協議實現的每一個細節;二是OpenSSL實現的SSL協議是純粹的SSL協議,沒有跟其它協議(如HTTP)協議結合在一起,澄清了SSL協議的本來面目。

對稱加密

  OpenSSL一共提供了8種對稱加密演算法,其中7種是分組加密演算法,僅有的一種流加密演算法是RC4。這7種分組加密演算法分別是AES、DES、Blowfish、CAST、IDEA、RC2、RC5,都支援電子密碼本模式(ECB)、加密分組連結模式(CBC)、加密反饋模式(CFB)和輸出反饋模式(OFB)四種常用的分組密碼加密模式。其中,AES使用的加密反饋模式(CFB)和輸出反饋模式(OFB)分組長度是128位,其它演算法使用的則是64位。事實上,DES演算法裡面不僅僅是常用的DES演算法,還支援三個金鑰和兩個金鑰3DES演算法。

非對稱加密

  OpenSSL一共實現了4種非對稱加密演算法,包括DH演算法、RSA演算法、DSA演算法和橢圓曲線演算法(EC)。DH演算法一般用於金鑰交換。RSA演算法既可以用於金鑰交換,也可以用於數字簽名,當然,如果你能夠忍受其緩慢的速度,那麼也可以用於資料加密。DSA演算法則一般只用於數字簽名。
資訊摘要
  OpenSSL實現了5種資訊摘要演算法,分別是MD2、MD5、MDC2、SHA(SHA1)和RIPEMD。SHA演算法事實上包括了SHA和SHA1兩種資訊摘要演算法。此外,OpenSSL還實現了DSS標準中規定的兩種資訊摘要演算法DSS和DSS1。

 

下載OpenSSL

  官網:http://distfiles.macports.org/openssl/
  在這裡插入圖片描述
  CSDN:https://download.csdn.net/download/qq21497936/11537079
  QQ群:1047134658(點選“檔案”搜尋“openssl”,群內與博文同步更新)

 

編譯OpenSSL

安裝windows下linux編譯環境msys

  在這裡插入圖片描述
  將qt的mingw和本機的perl拷貝到msys資料夾下,然後新增路徑
  在這裡插入圖片描述

配置OpenSSL

   配置安裝路徑
  在這裡插入圖片描述
  在這裡插入圖片描述
  此處卡了一個多小時,各種找原因,原來是需要使用msys而不是msys2
  在這裡插入圖片描述
  在這裡插入圖片描述

修改Makefile

  在最上層Makefile找到變數PERL
  直接修改如下圖:
  在這裡插入圖片描述
  繼續mingw32-make.exe
  在這裡插入圖片描述
  漫長的等待後,繼續報錯
  在這裡插入圖片描述
  仔細看是應用的問題,連結庫失敗可能是,但是我們需要的
  檢視編譯出的庫
  
在這裡插入圖片描述

新增配置引數

  其實測試程式編譯缺少庫是路徑包含問題,多次嘗試,還是需要config的時候指定下路徑

./config --prefix=/usr/local --openssldir=/usr/local/openssl

編譯

mingw32-make.exe install -j4

  編譯成功,編譯過程和安裝過程都很漫長,估計得二三十分鐘
  在這裡插入圖片描述
  順利編譯,此時為了方便提取庫修改配置如下

./config --prefix=/home/yang/complie/install  \
 --openssldir=/home/yang/complie/install/openssl

  試幾次,有可能會出現錯誤,多執行緒導致一些前後依賴的錯誤

mingw32-make.exe install -j4

  議最後執行一次:

mingw32-make.exe install

  成功後如下:
  在這裡插入圖片描述
  可以測試以下:

Mingw32-make.exe test

  在這裡插入圖片描述
  時間也是非常長。

 

Install檔案結構打包

  編譯出來的是靜態庫(注意:筆者重頭再來一遍,配置時加了shared引數也還是靜態庫)。
  在這裡插入圖片描述

 

入坑

入坑一:Perl呼叫失敗

  在這裡插入圖片描述

解決方法

  修改頂層Makefile的Perl。
  在這裡插入圖片描述

入坑二:配置時作業系統型別錯誤

  在這裡插入圖片描述

解決方法

由msys2更換為msys1.0。

入坑三:編譯時,找不到庫定義

  在這裡插入圖片描述

解決方法

  配置時,需要加2個引數。
  在這裡插入圖片描述

 

相關文章