Windows下編譯openssl庫

1、概述

OpenSSL是一個開放源代碼的軟件庫包,它實現了 SSL(Secure SocketLayer)和 TLS(Transport Layer Security)協議,所以應用程序可以使用這個包來進行安全通信,避免竊聽,同時確認另一端連接者的身份。這個包廣泛被應用在互聯網的網頁服務器上。

SSL是啥?大家知道我們訪問網站的時候,以HTTPS開頭的表示你和服務器之間傳輸的數據經過了加密,這里所使用的加密協議就是SSL(Secure Sockets Layer,后來又推出了它的后續版本,改名叫TLS)。也就是說,把HTTP協議經過一層SSL協議進行加密包裝,就變成了HTTPS。當然,SSL/TLS還用在很多協議中,例如VPN、加密的電子郵件協議等。

在SSL協議中,我們使用了很多密碼學手段來保護數據,其中包括對稱密碼、公鑰密碼、數字簽名、證書、完整性校驗、偽隨機數生成等。由于這些算法和操作都非常復雜,于是開源社區就開發了一套庫,這個庫里面提供了很多現成的標準方法,其他開發者只要用正確調用這些方法,就可以實現SSL協議中的各種加密/解密操作了。這個庫就是開源的OpenSSL庫。

如何使用openssl?
一般情況下,直接到 Win32 OpenSSL 上下載已經編譯好的 OpenSSL 庫使用即可。但在某些情況下,可能需要適當的修改或者裁剪 OpenSSL,那么編譯它就成為了一個關鍵問題。
2、準備工作(win64為例)

1、下載并安裝 Visual Studio(以 VS 2013 為例)。

2、下載并安裝 ActivePerl,下載地址:http://www.activestate.com/activeperl/downloads ,我下載的版本是5.24.3.2404

安裝過程一律選默認即可。

ActivePerl一個perl腳本解釋器。其包含了包括有 Perl for Win32、Perl for ISAPI、PerlScript、Perl Package Manager四套開發工具程序,可以讓用戶編寫出適用于unix,windows,linux系統的CGI程序來。

安裝的只是perl的一個解釋程序啦,外觀上也不會發生什么變化,你在windows的cmd界面里輸入perl -v可查看你所安裝的版本。顯示如下圖:

3、下載并安裝 Nasm 匯編器,下載地址:http://www.nasm.us/ ,我下載的是nasm-2.14-installer-x64.exe

這里安裝完成后,將安裝目錄 C:\Program Files\NASM(以你的安裝目錄為準) 添加到系統環境變量 Path 中。

配置環境變量:

右鍵計算機選擇屬性,選擇高級系統設置,選擇高級選項,再選擇右下方環境變量選項,給系統變量選擇新建,變量名隨便起不沖突即可(如NASM),變量值填寫安裝目錄(如 C:\Program Files\NASM)

??? 注:若桌面沒有計算機選項的可通過控制面板 — 系統和安全 — 系統到該目錄。或開始 — 計算機 — 右鍵 — 選擇屬性。

4、下載并安裝 OpenSSL,下載地址:https://www.openssl.org/source/ ,我下載的版本是 openssl-1.0.2p.tar.gz

下載完成后,將 OpenSSL 包解壓至 C:\openssl-1.0.2p,便可以進行編譯了。

注意: 解壓后的目錄中有兩個文件 - INSTALL.W32、INSTALL.W64,包含了 OpenSSL 的各個編譯步驟。

注意:當前最新版本為openssl-1.1.1.tar.gz,解壓后的目錄中并沒有INSTALL.W32、INSTALL.W64兩個文件,該版本安裝方法具體可參考README和INSTALL兩個文件。
3、編譯OpenSSL
3.1、配置編譯環境

我們用VS2013來作為編譯工具,使用VS2013對應的命令行進入,操作步驟如下:

開始 — 所有程序 — Visual Studio 2013 — Visual Studio Tools — 選擇一個命令提示工具

進入命令提示符,然后定位至OpenSSL的安裝目錄,如 C:\openssl-1.0.2m

注意:這里不建議使用cmd命令行,使用cmd命令行在執行nmake -f ms\nt.mak編譯時,會提示’nmake’ 不是內部或外部命令,也不是可運行的程序。(需要配置環境變量啥的,沒有試,這里直接使用VS 2013命令行)
3.2、配置編譯文件和模式

輸入如下命令:

perl Configure VC-WIN64A no-asm --prefix=F:\openssl

??? 1

參數說明:
VC-WIN64A表示Windows 64位系統,32位系統請換成VC-WIN32,若要使用debug版本,請使用debug-VC-WIN64A或debug-VC-WIN32
no-asm 表示不用匯編,不設置此屬性,可能會導致編譯不過(建議使用)
–prefix=F:\openssl將其安裝到F盤的openssl文件夾下,省略會安裝在默認路徑下

顯示如下圖:

3.3、生成編譯配置文件

若為Windows 64位系統,執行

ms\do_win64a.bat

??? 1

若為Windows 32位系統,執行

ms\do_ms.bat

??? 1

執行這一步之后,在ms目錄下會生成nt.mak和ntdll.mak兩個編譯配置文件
nt.mak 用于生成靜態lib庫
ntdll.mak 用于生成動態dll庫
3.4、編譯

靜態庫

nmake -f ms\nt.mak?? ?

??? 1

動態庫

nmake -f ms\ntdll.mak

??? 1

注:這里也可以直接執行如下命令,將靜態庫或動態庫直接安裝到指定目錄(或默認目錄):

//靜態庫
nmake -f ms\nt.mak install
//或
//動態庫
nmake -f ms\ntdll.mak install

??? 1
??? 2
??? 3
??? 4
??? 5

3.5、測試

測試靜態庫:

?nmake -f ms\nt.mak test

??? 1

測試動態庫:

?nmake -f ms\ntdll.mak test

??? 1

若最終顯示 passed all tests 則說明生成的庫正確:

3.6、安裝

安裝靜態庫:

nmake -f ms\nt.mak install

??? 1

安裝動態庫:

nmake -f ms\ntdll.mak install

??? 1

編譯、安裝完成后,即可在 F:\openssl目錄下看到生成的相關文件和文件夾,如下圖:

注:F:\openssl目錄為執行 perl Configure VC-WIN64A no-asm --prefix=F:\openssl 時指定的目錄,若沒有通過–prefix=指定目錄,會安裝到一個默認目錄(命令行內會有提示),如下圖顯示默認安裝到了 C:\usr\local\ 目錄


3.7、其他

清除上次靜態庫的編譯,以便重新編譯:

nmake -f ms\nt.mak clean

??? 1

清除上次動態庫的編譯,以便重新編譯:

nmake -f ms\ntdll.mak clean

————————————————
版權聲明:本文為CSDN博主「mayue_csdn」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/mayue_web/article/details/83997969

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

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

相關文章

Makefile規則介紹

Makefile 一個規則 三要素:目標,依賴,命令 目標:依賴命令 1、第一條規則是用來生成終極目標的規則 如果規則中的依賴不存在,向下尋找其他的規則 更新機制:比較的是目標文件和依賴文件的時間 兩個函…

windows環境下C語言socket編程

最近由于實驗需要,要求寫一個c程序與java程序通信的軟件,為了測試首先寫了一個windows環境下c語言的socket(tcp)通信程序。 首先socket通信的步驟: 圖一 socket通信步驟(轉載) 圖二 三次握手協議&…

進程控制塊(PCB)

進程控制塊PCB 我們知道,每個進程在內核中都有一個進程控制塊(PCB)來維護進程相關的信息,Linux內核的進程控制塊是task_struct結構體。 /usr/src/linux-headers-3.16.0-30/include/linux/sched.h文件中可以查看struct task_struct…

網絡層攻擊防御

網絡層攻擊防御 網絡層攻擊防御主要分為以下三類: TCP類報文攻擊防御 UDP類報文攻擊防御 ICMP類報文攻擊防御 TCP類報文攻擊防御 TCP正常的交互過程: 圖:TCP正常交互過程 在TCP/IP協議中,TCP協議提供可靠的連接服務&#xff0c…

Linux之環境變量

常見環境變量 按照慣例,環境變量字符串都是namevalue這樣的形式,大多數name由大寫字母加下劃線組成,一般把name的部分叫做環境變量,value的部分則是環境變量的值。環境變量定義了進程的運行環境,一些比較重要的環境變量…

環境變量操作函數

getenv獲取環境變量值的函數&#xff1b; setenv改變或者添加環境變量函數&#xff1b; unsetenv 取消環境變量&#xff1b; &#xff08;可以在終端上man 函數名來獲取詳細的函數信息&#xff09; #include<stdio.h> #include<stdlib.h> #include<string.h>…

Makefile(三)

在平時使用中&#xff0c;可以使用以下的makefile來編譯單獨的代碼 src $(wildcard *.c) obj $(patsubst %.c, %.o, $(src))CC gcc CFLAGS -Wall -gall:$(target)$(target):%:%.c$(CC) $< -o $ $(CFLAGS).PHONY: clean all clean:-rm -rf $(target) 使用方法就是make 后…

位運算(C++)

C輸出十六進制 #include<iostream> #include<iomanip> using namespace std;int main() {int a 60;int b 13;int c a &b;cout << "a : hex "<<hex << a << endl;cout << "b : hex "<<hex <<…

數學函數(C/C++)

C中包含頭文件<math.h> C包含頭文件<cmath> 函數 double cos&#xff08;double&#xff09; 該函數返回弧度角&#xff08;double型&#xff09;的余弦 double tan&#xff08;double&#xff09; 該函數返回弧度角&#xff08;double型&#xff09;的正切…

數據類型(C++)

不同系統會有不同差異&#xff1a; 類型 位(byte) 范圍 char 1 -128—127 or 0 – 255 unsigned char 1 0 – 255 signed int 1 -128—127 int 4 -2^31 – 2^32-1 unsigned int 4 0 – 2^32 signed int 4 -2^31 – 2^32-1 short int 2 2^15 – 2^15-1 …

日期與時間(C/C++)

C繼承了C語言用于日期和時間操作的結構和函數&#xff0c;使用之前程序要引用<ctime>頭文件 有四個與時間相關的類型:clock_t、time_t、size_t、和tm。類型clock_t、size_t、和time_t能夠把系統時間和日期表示為某種整數。 結構體tm把時間和日期以C結構的形式保存&#x…

標準輸入輸出(C++)

輸入輸出流函數&#xff08;模板&#xff09; #include<iostream> #include<iomanip> using namespace std; int main() {cout << setiosflags(ios::left|ios::showpoint); //設左對齊cout.precision(5); //設置除小數…

拷貝函數和構造函數

類的構造函數&#xff1a; 類的構造函數是類的一種特殊的成員函數&#xff0c;它會在每次創建類的新對象時執行。 構造函數的名稱與類的名稱是完全相同的&#xff0c;并且不會返回任何類型&#xff0c;也不會返回void。 構造函數可用于為某些成員變量初始值。 默認的構造函數是…

拷貝構造函數

拷貝構造函數是一種特殊的構造函數&#xff0c;它在創建對象時&#xff0c;使用的是同一類中之前創建的對象來初始化新創建的對象。拷貝構造函數通常用于&#xff1a; l 通過使用另一個同類型的對象來初始化新創建的對象&#xff1b; l 復制對象把它作為參數傳遞給函數&#…

Linux進程通信之管道

進程間完成數據傳遞需要借助操作系統提供的特殊的方法&#xff0c;比如&#xff1a;文件、管道、信號、共享內存、消息隊列、套接字、命名管道等。但現在常用的進程間通信方式有&#xff1a; 管道 – 使用最簡單 pipe 管道一般讀寫行為 FIFO&#xff08;有名管道&#xff09;&a…

Linux進程通信之文件

父子進程共享打開的文件描述符------使用文件完成進程間通信. /*** fork_share_fd.c***/ #include <stdio.h> #include <unistd.h> #include <string.h> #include <stdlib.h> #include <fcntl.h> #include <sys/wait.h>int main(void) {in…

dup2函數

將當前系統中的進程信息打印到文件中 命令行&#xff1a;ps aux > out 將ps得到的信息重定向到out文件中 使用dup2文件在程序中完成。 int dup2(int oldfd,int newfd); /*** dup2.c ***/ #include<stdio.h> #include<fcntl.h> #include<unistd.h> #includ…

wait()函數

wait()函數&#xff1a;回收僵尸進程 父進程調用wait函數可以回收子進程終止信息。該函數有三個功能&#xff1a; 1&#xff09; 阻塞等待子進程退出 2&#xff09; 回收子進程殘留資源 3&#xff09; 獲取子進程結束狀態&#xff08;退出原因&#xff09; /*** zoom_test.c **…

waitpid()函數

waitpid函數 作用同于wait&#xff0c;但可指定pid進程清理&#xff0c;可以不阻塞。 pid_t waitpid(pid_t pid,int *status,int options);成功&#xff1a;返回清理掉的子進程ID&#xff1b;失敗&#xff1a;-1&#xff08;無子進程&#xff09; 特殊參數和返回情況&#xff1…

孤兒進程、僵尸進程

孤兒進程&#xff1a;父進程先于子進程結束&#xff0c;則子進程成為孤兒進程&#xff0c;子進程的父進程成為init進程&#xff0c;稱為init進程領養孤兒進程。 /*** orphan.c ***/ #include <stdio.h> #include <unistd.h> #include <sys/wait.h>int main(v…