您好,登錄后才能下訂單哦!
OpenSSL開發(fā)環(huán)境配置教程分享給大家,具體內(nèi)容如下
【環(huán)境信息】
Windows 10 Enterprise Version 10.0.15063
下載地址:http://www.itellyou.cn/)
Visual Studio Enterprise 2017 Version 15.2(26430.12)
下載地址:https://www.visualstudio.com/downloads)
OpenSSL v1.1.0f
下載地址:https://slproweb.com/products/Win32OpenSSL.html)
【提醒事項(xiàng)】
1。安裝OpenSSL有兩種方法,第一種為下載OpenSSL源代碼并由自己編譯后使用;第二種為下載已編譯好的安裝包,安裝后直接可以使用。因第一種方法十分繁瑣,需要安裝Ruby進(jìn)行編譯,同時(shí)編譯過程中可能產(chǎn)生各種各種的問題,因此在此采用第二種方法
2。每次新建工程之后都要配置一下OpenSSL開發(fā)環(huán)境
3。本人用的英文環(huán)境(英文操作系統(tǒng)+英文軟件),因此操作界面語言可能會(huì)和中文環(huán)境有些不同,但并不影響功能
【具體步驟】
1。下載編譯好的OpenSSL安裝包(下載地址見上方),此處有Win32和Win64可選,這里的位數(shù)指的是你調(diào)用OpenSSL開發(fā)出來的軟件的位數(shù)版本,而不是你計(jì)算機(jī)的位數(shù)。開發(fā)32位軟件選擇Win32,64位選擇Win64,如果同時(shí)需要開發(fā)32位和64位的則下載兩個(gè)。確定好位數(shù)后,下載Win32/64 OpenSSL v1.1.0f(版本號(hào)可能會(huì)因更新而有所不同),“Light版”為“輕量版”,即只包含了核心功能的版本,本文演示的為“非Light版”
2。下載完后打開安裝,選擇安裝位置,64位和32位不要安裝在同一個(gè)目錄下
3。選擇把dll復(fù)制到OpenSSL目錄下(主要是為了以后好找,如果選擇復(fù)制到Windows系統(tǒng)目錄下,天知道復(fù)制到哪里去了。。。)
4。安裝完成后,如果有捐款意向的可以捐款(別誤會(huì)我不是在打廣告。。。即使你捐款了我也拿不到一分錢),沒有意向則取消掉鉤,然后點(diǎn)“Finish”
5。新建一個(gè)解決方案,方便起見,這里新建一個(gè)控制臺(tái)應(yīng)用程序,這里我沒有勾選“Create directory for solution”是因?yàn)檫@是一個(gè)單項(xiàng)目解決方案,所以我覺得沒有必要多創(chuàng)建一層文件夾
6。勾選“Empty project”(這個(gè)是個(gè)人習(xí)慣,可能鉤不鉤并沒有什么影響(“可能”這個(gè)詞就很騷了。。。))
7。右擊工程,選擇“Properties”
8。點(diǎn)擊左方的“VC++ Directories”,然后左上角選擇“All Configurations”
9。右上角選擇平臺(tái),這里演示x64的,如果是開發(fā)Win32軟件就選Win32,如果要Win64和Win32兼顧,則分別配置一下(就是先選擇Win32進(jìn)行配置,然后再選擇x64進(jìn)行配置)
10。選中“Include Directories”,點(diǎn)擊右邊的下拉按鈕,點(diǎn)擊“Edit…”
11。點(diǎn)擊右上方的“New Line”按鈕,然后點(diǎn)擊新行右邊的“…”按鈕
12。在彈出的目錄選擇界面中選擇OpenSSL安裝目錄下的“include”文件夾,點(diǎn)擊“Select Folder”,再點(diǎn)擊“OK”完成添加
13。同樣的方法,將安裝目錄下的“l(fā)ib”文件夾添加到“Library Directories”中
14。將OpenSSL安裝目錄下bin文件夾中的“l(fā)ibcrypto-1_1-x64.dll”和“l(fā)ibssl-1_1-x64.dll”(名字后面的版本號(hào)可能因更新而不同)復(fù)制到工程目錄下
15。將工程平臺(tái)調(diào)整為自己需要的平臺(tái),這里演示x64平臺(tái)
16。添加lib文件,這里有A、B兩種方法,分別列出:
16-A:
在代碼中添加
#pragma comment(lib,"libssl.lib") #pragma comment(lib,"libcrypto.lib")
16-B:
在“Property Pages->Linker->Input->Additional Dependencies”添加libssl.lib和libcrypto.lib
【測(cè)試代碼】
1。這段代碼是用C++和Windows API寫的
2。這里添加lib文件用的方法A,如果想用方法B則注釋或刪掉對(duì)應(yīng)的“#pragma comment…”即可
3。這段代碼是用https://www.baidu.com來測(cè)試的,如果想要修改為其他測(cè)試地址,除了修改第25行的wstrHost外,還應(yīng)修改第77行的strWrite
#include<tchar.h> #include<WinSock2.h> #include<WS2tcpip.h> #include<iostream> #include<openssl\ssl.h> #pragma comment(lib,"ws2_32.lib") #pragma comment(lib,"libssl.lib") #pragma comment(lib,"libcrypto.lib") CONST INT RECV_SIZE = 8192; INT _tmain(INT argc, LPTSTR argv[]) { //啟動(dòng)wsa WSADATA wsadData; WSAStartup(MAKEWORD(2, 2), &wsadData); //獲取Host的IP地址等信息 ADDRINFOT aiHints; ZeroMemory(&aiHints, sizeof(ADDRINFOT)); aiHints.ai_family = AF_INET; aiHints.ai_flags = AI_PASSIVE; aiHints.ai_protocol = 0; aiHints.ai_socktype = SOCK_STREAM; std::wstring wstrHost = TEXT("www.baidu.com"); PADDRINFOT paiResult; GetAddrInfo(wstrHost.c_str(), NULL, &aiHints, &paiResult); //創(chuàng)建套接字 SOCKET sSocket = socket(AF_INET, SOCK_STREAM, 0); if (sSocket == SOCKET_ERROR) { std::wcout << "Error socket" << std::endl; return -1; } //連接Host SOCKADDR_IN sinHost; sinHost.sin_addr = ((LPSOCKADDR_IN)paiResult->ai_addr)->sin_addr; sinHost.sin_family = AF_INET; sinHost.sin_port = htons(443); if (connect(sSocket, (LPSOCKADDR)&sinHost, sizeof(SOCKADDR_IN)) == SOCKET_ERROR) { std::wcout << "Error connect" << std::endl; return -1; } //初始化OpenSSL庫(kù) //(雖然不知道為什么,但是不加這三行似乎并不會(huì)導(dǎo)致什么問題,在不加這3行的情況下測(cè)試了幾個(gè)網(wǎng)站并沒有發(fā)現(xiàn)任何問題喵) SSL_library_init(); SSLeay_add_ssl_algorithms(); SSL_load_error_strings(); //創(chuàng)建SSL會(huì)話環(huán)境等 SSL_CTX *pctxSSL = SSL_CTX_new(TLSv1_2_client_method()); if (pctxSSL == NULL) { std::wcout << "Error SSL_CTX_new" << std::endl; return -1; } SSL *psslSSL = SSL_new(pctxSSL); if (psslSSL == NULL) { std::wcout << "Error SSL_new" << std::endl; return -1; } SSL_set_fd(psslSSL, sSocket); INT iErrorConnect = SSL_connect(psslSSL); if (iErrorConnect < 0) { std::wcout << "Error SSL_connect, iErrorConnect=" << iErrorConnect << std::endl; return -1; } std::wcout << "SSL connection using " << SSL_get_cipher(psslSSL) << std::endl; //發(fā)包 std::string strWrite = "GET https://www.baidu.com/ HTTP/1.1\r\n" "Host: www.baidu.com\r\n" "Connection: close\r\n\r\n"; INT iErrorWrite = SSL_write(psslSSL, strWrite.c_str(), strWrite.length()) < 0; if (iErrorWrite < 0) { std::wcout << "Error SSL_write" << std::endl; return -1; } //收包并輸出 //這里接受的是char形式的,所以中文會(huì)亂碼 //如果要正常顯示中文,需要再轉(zhuǎn)換為wchar_t或std::wstring LPSTR lpszRead = new CHAR[RECV_SIZE]; INT iLength=1; while (iLength >= 1) { iLength = SSL_read(psslSSL, lpszRead, RECV_SIZE - 1); if (iLength < 0) { std::wcout << "Error SSL_read" << std::endl; delete[] lpszRead; return -1; } lpszRead[iLength] = TEXT('\0'); std::wcout << lpszRead; } delete[] lpszRead; return 0; }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。