2017-2018-1 20155230 實驗五 通信協議設計

OpenSSL簡介

  • OpenSSL是一個SSL協議的開源實現,採用C語言做爲開發語言,具有了跨平臺的能力,支持Unix/Linux、Windows、Mac OS等多種平臺。算法

  • OpenSSL最先的版本在1995年發佈,1998年後開始由OpenSSL項目組維護和開發。當前最新的版本是1.1.0 alpha版本,徹底實現了對SSLv一、SSLv二、SSLv3和TLS的支持。。目前,OpenSSL已經獲得了普遍的應用,許多類型的軟件中的安所有分都使用了OpenSSL的庫,如VOIP的OpenH323協議、Apache服務器、Linux安全模塊等等。ubuntu

  • OpenSSL整個軟件包大概能夠分紅三個主要的功能部分:密碼算法庫、SSL協議庫、應用程序安全

  • OpenSSL源碼的目錄結構也是圍繞這三個功能部分進行規劃的。服務器

  • 密碼算法庫是一個強大完整的密碼算法庫,它是OpenSSL的基礎部分,也是很值得通常密碼安全技術人員研究的部分,它實現了目前大部分主流的密碼算法和標準。主要包括對稱算法、非對稱算法、散列算法、數字簽名和認證、X509數字證書標準、PKCS十二、PKCS7等標準。其餘兩個功能部分SSL協議和應用程序都是基於這個庫開發的。函數

  • 在密碼算法庫的基礎上實現的,SSL協議部分徹底實現和封裝了SSL協議的三個版本和TLS協議。使用協議庫,你徹底能夠創建一個SSL服務器和SSL客戶端。測試

  • 應用程序是基於密碼算法庫和SSL協議庫實現的命令,熟悉OpenSSL能夠從使用這些應用程序開始。應用程序覆蓋了密碼技術的應用,主要包括了各類算法的加密程序和各類類型密鑰的產生程序(如RSA、Md五、Enc等等)、證書籤發和驗證程序(如Ca、X50九、Crl等)、SSL鏈接測試程序(如S_client和S_server等)以及其它的標準應用程序(如Pkcs12和Smime等)。加密

### Linux下OpenSSL的安裝

環境spa

Ubuntu 14.10
OpenSSL 1.1.0alphacode

Ubuntu最新版本下載參見http://www.ubuntu.com/download/。server

OpenSSL最新版本下載參見http://www.openssl.org/source/。

#### 安裝過程

- Linux下的應用大多能夠直接使用,也能夠獲取源代碼本身進行編譯、安裝,使用源代碼安裝的過程通常是:

config
make
make install

- OpenSSL的安裝也是這樣。首先解壓源代碼:```tar xzvf openssl-1.1.0-pre1.tar.gz```而後進入源代碼目錄:```cd openssl-1.1.0-pre1```而後使用下列命令編譯安裝:```./configure```、```make```、```sudo make install```

### 基於OpenSSL的程序都要遵循如下幾個步驟:

- (1)OpenSSL初始化:

在使用OpenSSL以前,必須進行相應的協議初始化工做,能夠經過這個函數實現:```int SSL_library_int(void)```

- (2)選擇會話協議:

在利用OpenSSL開始SSL會話以前,須要爲客戶端和服務器制定本次會話採用的協議,目前可以使用的協議包括TLSv1.0、SSLv二、SSLv三、SSLv2/v3。須要注意的是,***客戶端和服務器必須使用相互兼容的協議,不然SSL會話將沒法正常進行***。

- (3)建立會話環境:

在OpenSSL中建立的SSL會話環境稱爲CTX,使用不一樣的協議會話,其環境也不同的。申請SSL會話環境的OpenSSL函數是:```SSL_CTX *SSL_CTX_new(SSL_METHOD * method)```,當SSL會話環境申請成功後,還要根據實際的須要設置CTX的屬性,一般的設置是指定SSL握手階段證書的驗證方式和加載本身的證書。

制定證書驗證方式的函數是:```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);```
在將證書和私鑰加載到SSL會話環境以後,就能夠調用下面的函數來驗證私鑰和證書是否相符:```int SSL_CTX_check_private_key(SSL_CTX *ctx);```

- (4)創建SSL套接字

SSL套接字是創建在普通的TCP套接字基礎之上,在創建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);//綁定只寫套接字

- (5)完成SSL握手

在成功建立SSL套接字後,客戶端應使用函數```SSL_connect( )```替代傳統的函數```connect( )```來完成握手過程```int SSL_connect(SSL *ssl)```而對服務器來說,則應使用函數```SSL_ accept ( )```替代傳統的函數```accept ( )```來完成握手過程:```int SSL_accept(SSL *ssl)```握手過程完成以後,一般須要詢問通訊雙方的證書信息,以便進行相應的驗證,這能夠藉助於下面的函數來實現```X509 SSL_get_peer_certificate(SSL ssl)```該函數能夠從SSL套接字中提取對方的證書信息,這些信息已經被SSL驗證過了。```X509_NAMEX509_get_subject_name(X509 a)```該函數獲得證書所用者的名字。

- (6)進行數據傳輸

當SSL握手完成以後,就能夠進行安全的數據傳輸了,在數據傳輸階段,須要使用```SSL_read( )```和```SSL_write( )```來替代傳統的```read( )```和```write( )```函數,來完成對套接字的讀寫操做:```int SSL_read(SSL *ssl,void *buf,int num)```、```int SSL_write(SSL *ssl,const void *buf,int num)```

- (7)結束SSL通訊

當客戶端和服務器之間的數據通訊完成以後,調用下面的函數來釋放已經申請的SSL資源:```int SSL_shutdown(SSL *ssl);//關閉SSL套接字```、```void SSl_free(SSL *ssl);//釋放SSL套接字```、```void SSL_CTX_free(SSL_CTX *ctx); //釋放SSL會話環境```

### 實驗目的

#### 任務一
- 編寫一個測試代碼test_openssl.c:

include <stdio.h>

include <openssl/evp.h>

int main(){

OpenSSL_add_all_algorithms();

return 0;

}

<span id="1"></span>
- 而後用下面命令編譯:
```gcc -o to test_openssl.c -I(大寫i) /usr/local/ssl/inlcude -L(這個位置老師給的教程步驟裏沒有-L因此沒法編譯)/usr/local/ssl/lib -ldl -lpthread```執行```./to;echo $?```結果打印0.

![](http://images2017.cnblogs.com/blog/1071497/201712/1071497-20171217210027796-988626714.png)

### 任務二

- 在Ubuntu中實現對實驗二中的「wc服務器」經過混合密碼系統進行防禦

#### 混合密碼系統

- 編寫一個測試代碼

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,測試結果代表安裝成功。

![](http://images2017.cnblogs.com/blog/1071497/201712/1071497-20171217211614593-1158125274.png)

### 遇到的問題1:實驗1中老師給出的編譯命令有錯
#### [改正方式](#1)
相關文章
相關標籤/搜索