# 2017-2018-1 20155318 《信息安全系統設計基礎》 實驗五 通訊協議設計
2017-2018-1 20155318 《信息安全系統設計基礎》 實驗五 通訊協議設計
Linux下OpenSSL的安裝與測試
- 任務要求:在Ubuntu中完成 http://www.cnblogs.com/rocedu/p/5087623.html 中的作業
OpenSSL簡介
OpenSSL是一個SSL協議的開源實現,采用C語言作為開發語言,具備了跨平臺的能力,支持Unix/Linux、Windows、Mac OS等多種平臺。
- OpenSSL整個軟件包大概可以分成三個主要的功能部分:
- 密碼算法庫(其他兩個功能部分SSL協議和應用程序都是基於這個庫開發的)
- SSL協議庫(SSL服務器和SSL客戶端)
- 應用程序
實驗步驟
- 前往OpenSSL官網,下載OpenSSL源碼,下載壓縮包“openssl-master.zip
- 在Linux下使用
unzip openssl-master.zip
命令解壓 - 進入源代碼目錄
cd openssl-1.1.0-pre1
使用如下命令進行安裝:
$ ./config $ make $ make test $ make install
編寫一個測試代碼test_openssl.c:
#include <stdio.h> #include <openssl/evp.h> int main(){ OpenSSL_add_all_algorithms(); return 0; }
使用
gcc -o test_openssl test_openssl.c -L/usr/local/ssl/lib -lcrypto -ldl -lpthread
命令編譯,生成“test_openssl”可執行文件,運行程序,並執行echo $?
,結果打印0,測試結果表明安裝成功。
其中編譯命令中:
-L
指定鏈接庫的文件夾地址;-lcrypto
導入OpenSSL所需包;-ldl
加載動態庫;-lpthread
鏈接POSIX thread庫
出現的問題及解決方案
問題1:編譯時出現
openssl/evpp.h:
錯誤提示
- 原因是在運行
make install
命令時沒有使用root權限,在運行命令時加上sudo後,重新編譯即可 - 問題2:編譯時出現
test_openssl.c:(.text+0xf):對‘OPENSSL_init_crypto’
未定義的引用報錯 解決方案:參考狄惟佳同學的博客,將“openssl-master”文件夾下的“libcrypto.a”和“libssl.a”放在
/usr/local/ssl/lib
目錄下(註意使用sudo權限),註意鏈接的順序。
作業
- 兩人一組
- 基於Socket實現TCP通信,一人實現服務器,一人實現客戶端
- 研究OpenSSL算法,測試對稱算法中的AES,非對稱算法中的RSA,Hash算法中的MD5
- 選用合適的算法,基於混合密碼系統實現對TCP通信進行機密性、完整性保護。
- 學有余力者,對系統進行安全性分析和改進。
基於Socket實現tcp通信
函數
- socket():建立一個socket連接,可指定socket類型等信息。在建立socket連接之後,可對sockaddr或sockaddr_in結構進行初始化,以保存所建立的socket地址信息。
- bind():將本地IP地址綁定到端口號,若綁定其他IP地址則不能成功
- listen():在服務端程序成功建立套接字和與地址進行綁定之後,用listen()函數來創建一個等待隊列,在其中存放未處理的客戶端連接請求
- connect():在TCP中是用於bind()的之後的客戶端,用於與服務器端建立連接
- accept():創建等待隊列之後,調用此函數等待並接收客戶端的連接請求
- read()/write()
- send()/recv()
- close():完成了寫操作後關閉相應的socket描述字
- 服務器代碼
客戶端代碼
- 使用對稱加密指令作為enc指令的參數調用對稱加密指令
AES
利用RSA對hello文件進行加密
MD5
出現的問題及解決方案
問題1:
- 編譯運行時出現libcrypto.so.1.1:cannot open share object file:No such file or directory的錯誤提示,檢查後並未發現輸入、配置的錯誤,重新啟動虛擬機後正常
問題2:
輸入錯誤
混合密碼系統
任務要求:在Ubuntu中實現對實驗二中的“wc服務器”通過混合密碼系統進行防護
OpenSSL函數
頭文件:
#include <openssl/ssl.h> #include <openssl/err.h>
- OpenSSL初始化:
int SSL_library_int(void);
- 選擇會話協議:目前能夠使用的協議包括TLSv1.0、SSLv2、SSLv3、SSLv2/v3,客戶端和服務器必須使用相互兼容的協議
- 創建會話環境:(CTX)使用不同的協議會話,其環境也不一樣的。
申請SSL會話環境的OpenSSL函數是:
SSL_CTX *SSL_CTX_new(SSL_METHOD * method);
制定證書驗證方式的函數是:
int SSL_CTX_set_verify(SSL_CTX *ctx,int mode,int(*verify_callback),int(X509_STORE_CTX *));
為SSL會話環境加載CA證書的函數是:
SSL_CTX_load_verify_location(SSL_CTX *ctx,const char *Cafile,const char *Capath);
為SSL會話加載用戶證書的函數是:
SSL_CTX_use_certificate_file(SSL_CTX *ctx, const char *file,int type);
為SSL會話加載用戶私鑰的函數是:
SSL_CTX_use_PrivateKey_file(SSL_CTX *ctx,const char* file,int type);
驗證私鑰和證書是否相符:
int SSL_CTX_check_private_key(SSL_CTX *ctx);
建立SSL套接字
SSL *SSl_new(SSL_CTX *ctx);//申請一個SSL套接字
int SSL_set_fd(SSL *ssl,int fd);)//綁定讀寫套接字
int SSL_set_rfd(SSL *ssl,int fd);//綁定只讀套接字
int SSL_set_wfd(SSL *ssl,int fd);//綁定只寫套接字
完成SSL握手
進行數據傳輸
結束SSL通信
int SSL_shutdown(SSL *ssl);//關閉SSL套接字
void SSl_free(SSL *ssl);//釋放SSL套接字
void SSL_CTX_free(SSL_CTX *ctx); //釋放SSL會話環境
實驗步驟
編譯server.c
gcc -o server server.c -I /usr/local/ssl/include -L/usr/local/ssl/lib -lssl -lcrypto -ldl -lpthread
編譯telent.c
gcc -o telent telent.c -I /usr/local/ssl/include -L/usr/local/ssl/lib -lssl -lcrypto -ldl -lpthread
生產私鑰和證書
openssl genrsa -out privkey.pem 1024 openssl req -new -x509 -key privkey.pem -out CAcert.pem -days 1095
運行
./server 7838 1 CAcert.pem privkey.pem ./telent 127.0.0.1 7838
碼雲鏈接
實驗體會
本次實驗讓我對OpenSSL的使用有了更為深入的了解,在安裝過程中出現了很多錯誤的原因都是沒有使用root權限,在實驗過程中上網查詢了許多資料,今後的學習中會更加重視網絡上豐富實踐資源的使用。
# 2017-2018-1 20155318 《信息安全系統設計基礎》 實驗五 通訊協議設計