1. 程式人生 > ># 2017-2018-1 20155318 《信息安全系統設計基礎》 實驗五 通訊協議設計

# 2017-2018-1 20155318 《信息安全系統設計基礎》 實驗五 通訊協議設計

應用程序 .cn 代碼 下使用 申請 只讀 genrsa 關閉 accept

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權限),註意鏈接的順序。
    技術分享圖片

作業
  1. 兩人一組
  2. 基於Socket實現TCP通信,一人實現服務器,一人實現客戶端
  3. 研究OpenSSL算法,測試對稱算法中的AES,非對稱算法中的RSA,Hash算法中的MD5
  4. 選用合適的算法,基於混合密碼系統實現對TCP通信進行機密性、完整性保護。
  5. 學有余力者,對系統進行安全性分析和改進。
  • 基於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 《信息安全系統設計基礎》 實驗五 通訊協議設計