在Windows下安装GmSSL
本文屬于《GmSSL國(guó)密加密算法庫(kù)使用系列教程》之一,歡迎查看其它文章。
在Windows下安裝GmSSL
- 一、關(guān)于GmSSL
- 二、編譯工具準(zhǔn)備
- 1、安裝VS2017
- 2、安裝ActivePerl
- 3、安裝NASM
- 三、GmSSL源碼準(zhǔn)備
- 四、編譯與安裝GmSSL
- 1、進(jìn)入GmSSL源碼目錄
- 2、配置編譯生成64位的庫(kù)
- 3、編譯
- 4、安裝
- 5、配置環(huán)境變量
- 五、解決編譯報(bào)錯(cuò)
一、關(guān)于GmSSL
GmSSL是一個(gè)開源的密碼工具箱,支持SM2/SM3/SM4/SM9/ZUC等國(guó)密(國(guó)家商用密碼)算法、SM2國(guó)密數(shù)字證書及基于SM2證書的SSL/TLS安全通信協(xié)議,支持國(guó)密硬件密碼設(shè)備,提供符合國(guó)密規(guī)范的編程接口與命令行工具,可以用于構(gòu)建PKI/CA、安全通信、數(shù)據(jù)加密等符合國(guó)密標(biāo)準(zhǔn)的安全應(yīng)用。GmSSL項(xiàng)目是OpenSSL項(xiàng)目的分支,并與OpenSSL保持接口兼容。因此GmSSL可以替代應(yīng)用中的OpenSSL組件,并使應(yīng)用自動(dòng)具備基于國(guó)密的安全能力。GmSSL項(xiàng)目采用對(duì)商業(yè)應(yīng)用友好的類BSD開源許可證,開源且可以用于閉源的商業(yè)應(yīng)用。
GmSSL項(xiàng)目由北京大學(xué)關(guān)志副研究員的密碼學(xué)研究組開發(fā)維護(hù),項(xiàng)目源碼托管于GitHub。自2014年發(fā)布以來(lái),GmSSL已經(jīng)在多個(gè)項(xiàng)目和產(chǎn)品中獲得部署與應(yīng)用,并獲得2015年度“一銘杯”中國(guó)Linux軟件大賽二等獎(jiǎng)(年度最高獎(jiǎng)項(xiàng))與開源中國(guó)密碼類推薦項(xiàng)目。GmSSL項(xiàng)目的核心目標(biāo)是通過(guò)開源的密碼技術(shù)推動(dòng)國(guó)內(nèi)網(wǎng)絡(luò)空間安全建設(shè)。
以上內(nèi)容摘抄自GmSSL官網(wǎng):http://gmssl.org/
大家都知道OpenSSL,主要是提供國(guó)際加密算法庫(kù)。但是在最新的OpenSSL 1.1.1以上版本,已經(jīng)對(duì)國(guó)密算法提供了支持。
OpenSSL、GmSSL這倆提供的國(guó)密算法庫(kù),去看了下代碼,代碼實(shí)現(xiàn)是不一樣的,屬于條條大路通羅馬。
二、編譯工具準(zhǔn)備
1、安裝VS2017
按照此文進(jìn)行安裝,《Visual Studio Community 2017安裝步驟(只裝C++)》。
主要使用它的編譯器,若已安裝,則跳過(guò)。
2、安裝ActivePerl
64位ActivePerl-5.26下載地址:https://www.jb51.net/softs/27286.html#downintro2
進(jìn)行安裝,安裝類型選擇“Typical”,其他默認(rèn),最后一步安裝時(shí)間較長(zhǎng)。
在cmd中,輸入命令查看perl版本號(hào)。
perl -v表明安裝成功。
3、安裝NASM
nasm-2.15.05下載地址:https://www.nasm.us/pub/nasm/releasebuilds/2.15.05/win64/
以管理員身份運(yùn)行nasm-2.15.05-installer-x64.exe,進(jìn)行默認(rèn)安裝即可。
并將NASM安裝目錄添加至Windows系統(tǒng)環(huán)境變量Path中。
三、GmSSL源碼準(zhǔn)備
下載GmSSL源碼:https://github.com/guanzhi/GmSSL
四、編譯與安裝GmSSL
以管理員權(quán)限,打開VS Tools中“適用于VS 2017 的x64 本機(jī)工具命令提示”。
1、進(jìn)入GmSSL源碼目錄
cd /d D:\GmSSL-master\GmSSL-master2、配置編譯生成64位的庫(kù)
若需生成32位,則“perl Configure VC-WIN32”。
perl Configure VC-WIN64A3、編譯
nmake若報(bào)錯(cuò),參考第五節(jié)解決編譯報(bào)錯(cuò)。
直到編譯成功后繼續(xù)。
4、安裝
nmake install若前面不是以管理員權(quán)限運(yùn)行,“適用于VS 2017 的x64 本機(jī)工具命令提示”,則此處會(huì)報(bào)錯(cuò)。
GmSSL默認(rèn)安裝路徑為C:\Program Files\GmSSL
5、配置環(huán)境變量
將GmSSL命令行工具路徑C:\Program Files\GmSSL\bin,添加到環(huán)境變量中。
在cmd中,輸入命令查看GmSSL版本。
gmssl version至此,GmSSL安裝完畢。
五、解決編譯報(bào)錯(cuò)
報(bào)錯(cuò)如下:
libcrypto-1_1-x64.def : error LNK2001: 無(wú)法解析的外部符號(hào) EVP_get_ciphernames libcrypto-1_1-x64.def : error LNK2001: 無(wú)法解析的外部符號(hào) EVP_get_digestnames libcrypto.lib : fatal error LNK1120: 2 個(gè)無(wú)法解析的外部命令 NMAKE : fatal error U1077: “l(fā)ink”: 返回代碼“0x1”原因:
EVP_get_ciphernames、EVP_get_digestnames這2個(gè)函數(shù)位于GmSSL-master\include\openssl\evp.h,似乎是沒(méi)找到這2個(gè)函數(shù)的實(shí)現(xiàn)。
解決辦法:
在GmSSL的github倉(cāng)庫(kù)中,在GmSSL-master/crypto/evp/names2.c文件中,歷史版本有這2個(gè)函數(shù)的實(shí)現(xiàn),新版本不知道什么原因,這2個(gè)函數(shù)實(shí)現(xiàn)被刪除了。
所以,我們只需要從names2.c文件的歷史版本中,將函數(shù)實(shí)現(xiàn)拷貝出來(lái),追加到新names2.c文件末尾,再次重新編譯即可。
具體解決步驟:
為方便大家,特意將需要拷貝的代碼,列出來(lái),如下:
static void cipher_name_len(const EVP_CIPHER *cipher, const char *from,const char *to, void *x) {*((int *)x) += strlen(EVP_CIPHER_name(cipher)); }static void cipher_name(const EVP_CIPHER *cipher, const char *from,const char *to, void *x) {strcat((char *)x, EVP_CIPHER_name(cipher)); }char *EVP_get_ciphernames(int aliases) {char *ret = NULL;int len = 0;EVP_CIPHER_do_all_sorted(cipher_name_len, &len);ret = OPENSSL_zalloc(len);if (!ret) {return NULL;}EVP_CIPHER_do_all_sorted(cipher_name, ret);return ret; }char *EVP_get_digestnames(int aliases) {return "sm3:sha1:sha256"; }(1)首先將上述4個(gè)函數(shù),追加至names2.c文件末尾。
(2)然后執(zhí)行一下清除
(3)再執(zhí)行編譯
nmake就可以發(fā)現(xiàn),已經(jīng)可以編譯通過(guò)了。
思考:
在win下編譯報(bào)這2個(gè)函數(shù)未實(shí)現(xiàn),但是后來(lái)在Linux下編譯,在沒(méi)有改代碼的前提下,居然可以直接編譯通過(guò),看來(lái)這個(gè)與平臺(tái)還有關(guān)系。
若對(duì)你有幫助,歡迎點(diǎn)贊、收藏、評(píng)論,你的支持就是我的最大動(dòng)力!!!
同時(shí),阿超為大家準(zhǔn)備了豐富的學(xué)習(xí)資料,歡迎關(guān)注公眾號(hào)“超哥學(xué)編程”,即可領(lǐng)取。
總結(jié)
以上是生活随笔為你收集整理的在Windows下安装GmSSL的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 华为2015年实习生招聘考试试题
- 下一篇: 【C++深度剖析教程30】C++中抽象类