通信協議設計-1
在Ubuntu中完成 http://www.cnblogs.com/rocedu/p/5087623.html 中的做業
提交運行結果截圖html
通信協議設計-2
在Ubuntu中實現對實驗二中的「wc服務器」經過混合密碼系統進行防禦
提交測試截圖linux
1994年Netscape開發了SSL(Secure Socket Layer,安全套接層協議),專門用於保護Web通信。算法
它採用公鑰技術,其目標是保證兩個應用間通訊的保密性和可靠性,可在服務器和客戶機兩端同時實現支持。瀏覽器
現行Web瀏覽器廣泛將HTTP和SSL相結合,從而實現安全通訊。安全
SSL是獨立於各類協議的,經常使用於HTTP協議,但也可用於別的協議,如SMTP、TELNET等服務器
協議的目標:SSL/TLS被設計用來使用TCP提供一個可靠的端到端安全服務,爲兩個通信個體之間提供保密性和完整性(身份鑑別)。數據結構
SSL/TLS提供3種標準服務:信息保密、信息完整性和雙向認證併發
協議分爲兩層
底層:SSL記錄協議,爲上層協議提供基本的安全業務。
上層:SSL握手協議、SSL修改密碼說明協議、SSL警告協議,用於SSL交換過程的管理。eclipse
Linux下的應用大多能夠直接使用,也能夠獲取源代碼本身進行編譯、安裝,使用源代碼安裝的過程通常是:socket
configure make make installOpenSSL的安裝也是這樣。首先解壓源代碼:
tar xzvf openssl-1.1.0-pre1.tar.gz
而後進入源代碼目錄:cd openssl-1.1.0-pre1
而後使用下列命令編譯安裝:./configure make sudo make install
其實OpenSSL的安裝並非這樣的,輸入./configue
會報錯說找不到這個命令
unzip openssl-master.zip
解壓完成後使用cd ./oenpssl-master
命令進入解壓文件的目錄中再使用ls
命令會看到這個文件裏有一個ReadMe
使用'./ReadMe'打開文檔,裏面有詳細的安裝教程
Quick Start快速開始
-----------If you want to just get on with it, do:若是你只是想快速上手作好使用準備,請執行如下操做:
$ ./config
$ make
$ make test
$ make install
[If any of these steps fails, see section Installation in Detail below.][若是這些步驟中的任何一個失敗,請參見下面的詳細安裝部分。]
編寫一個測試代碼test_openssl.c:
#include <stdio.h> #include <openssl/evp.h> int main(){ OpenSSL_add_all_algorithms(); return 0; }
而後用下面命令編譯:
gcc -o to test_openssl.c -I /usr/local/ssl/inlcude /usr/local/ssl/lib -ldl -lpthread
執行./to;echo $
2017-2018-1 20155222 201552228 實驗三-併發程序
#include <openssl/ssl.h> #include <openssl/err.h> int SSL_library_int(void);//OpenSSL初始化:在使用OpenSSL以前,必須進行相應的協議初始化工做, SSL_CTX *SSL_CTX_new(SSL_METHOD * method);//建立會話環境:在OpenSSL中建立的SSL會話環境稱爲CTX,使用不一樣的協議會話,其環境也不同的。 int SSL_CTX_set_verify(SSL_CTX *ctx,int mode,int(*verify_callback),int(X509_STORE_CTX *));//制定證書驗證方式:當SSL會話環境申請成功後,還要根據實際的須要設置CTX的屬性,一般的設置是指定SSL握手階段證書的驗證方式和加載本身的證書。 SSL_CTX_load_verify_location(SSL_CTX *ctx,const char *Cafile,const char *Capath);//爲SSL會話環境加載CA證書 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);//在將證書和私鑰加載到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);//綁定只寫套接字 int SSL_connect(SSL *ssl);//客戶端在成功建立SSL套接字後,應使用函數SSL_connect( )替代傳統的函數connect( )來完成握手過程 int SSL_accept(SSL *ssl);//對服務器來說使用函數SSL_ accept ( )替代傳統的函數accept ( )來完成握手過程 X509 *SSL_get_peer_certificate(SSL *ssl);//握手過程完成以後,一般須要詢問通訊雙方的證書信息,以便進行相應的驗證 X509_NAME *X509_get_subject_name(X509 *a);//該函數能夠從SSL套接字中提取對方的證書信息,這些信息已經被SSL驗證過了。 int SSL_read(SSL *ssl,void *buf,int num);//當SSL握手完成以後,就能夠進行安全的數據傳輸了,在數據傳輸階段,須要使用SSL_read( )和SSL_write( )來替代傳統的read( )和write( )函數,來完成對套接字的讀寫操做 int SSL_write(SSL *ssl,const void *buf,int num); int SSL_shutdown(SSL *ssl);//關閉SSL套接字 void SSl_free(SSL *ssl);//釋放SSL套接字 void SSL_CTX_free(SSL_CTX *ctx); //釋放SSL會話環境
#include<netinet/in.h> // sockaddr_in …… #include <openssl/ssl.h> #include <openssl/err.h> …… #include<string.h> // bzero #define SERVER_PORT 8000 #define LENGTH_OF_LISTEN_QUEUE 20 #define BUFFER_SIZE 1024 #define FILE_NAME_MAX_SIZE 512 #define MAX 10000000 #define MAXBUF 1024 int main(void) { // 聲明並初始化一個服務器端的socket地址結構 struct sockaddr_in server_addr; …… server_addr.sin_port = htons(SERVER_PORT); SSL_CTX *ctx; //ssl數據結構 /* SSL 庫初始化 */ SSL_library_init(); /* 載入全部 SSL 算法 */ OpenSSL_add_all_algorithms(); /* 載入全部 SSL 錯誤消息 */ SSL_load_error_strings(); /* 以 SSL V2 和 V3 標準兼容方式產生一個 SSL_CTX ,即 SSL Content Text */ ctx = SSL_CTX_new(SSLv23_server_method()); /* 也能夠用 SSLv2_server_method() 或 SSLv3_server_method() 單獨表示 V2 或 V3標準 */ if (ctx == NULL) { ERR_print_errors_fp(stdout); exit(1);} /* 載入用戶的數字證書, 此證書用來發送給客戶端。 證書裏包含有公鑰 */ if (SSL_CTX_use_certificate_file(ctx, argv[3], SSL_FILETYPE_PEM) <= 0) { ERR_print_errors_fp(stdout); exit(1); } /* 載入用戶私鑰 */ if (SSL_CTX_use_PrivateKey_file(ctx, argv[4], SSL_FILETYPE_PEM) <= 0){ ERR_print_errors_fp(stdout); exit(1); } /* 檢查用戶私鑰是否正確 */ if (!SSL_CTX_check_private_key(ctx)) { ERR_print_errors_fp(stdout); exit(1); } // 建立socket,若成功,返回socket描述符 int server_socket_fd = socket(PF_INET, SOCK_STREAM, 0); …… // 綁定socket和socket地址結構 …… // socket監聽 …… while(1) { SSL *ssl; // 定義客戶端的socket地址結構 struct sockaddr_in client_addr; socklen_t client_addr_length = sizeof(client_addr); // 接受鏈接請求,返回一個新的socket(描述符),這個新socket用於同鏈接的客戶端通訊 // accept函數會把鏈接到的客戶端信息寫到client_addr中 int new_server_socket_fd = accept(server_socket_fd, (struct sockaddr*)&client_addr, &client_addr_length); …… /* 基於 ctx 產生一個新的 SSL */ ssl = SSL_new(ctx); /* 將鏈接用戶的 socket 加入到 SSL */ SSL_set_fd(ssl, new_server_socket_fd); /* 創建 SSL 鏈接 */ if (SSL_accept(ssl) == -1) { perror("accept"); close(new_fd); break; } // recv函數接收數據到緩衝區buffer中 char buffer[BUFFER_SIZE]; bzero(buffer, BUFFER_SIZE); if(recv(new_server_socket_fd, buffer, BUFFER_SIZE, 0) < 0) { perror("Server Recieve Data Failed:"); break; } // 而後從buffer(緩衝區)拷貝到file_name中 int len = SSL_read(ssl, buffer, MAXBUF); if (len > 0) printf("接收消息成功:'%s',共%d個字節的數據\n", buffer, len); else printf("消息接收失敗!錯誤代碼是%d,錯誤信息是'%s'\n",errno, strerror(errno)); char file_name[FILE_NAME_MAX_SIZE+1]; …… // 打開文件並讀取文件數據 FILE *fp = fopen(file_name, "r"); if(NULL == fp) { printf("File:%s Not Found\n", file_name); } else { //printf("buffer:%s\n",buffer);//buffer爲filename char *argv[]={"wc","-w",file_name,0}; execvp( "wc" ,argv); fclose(fp); /* 關閉 SSL 鏈接 */ SSL_shutdown(ssl); /* 釋放 SSL */ SSL_free(ssl); } // 關閉與客戶端的鏈接 close(new_server_socket_fd); } // 關閉監聽用的socket close(server_socket_fd); /* 釋放 CTX */ SSL_CTX_free(ctx); return 0; }
./configue
會報錯說找不到這個命令**直接百度openssl找到官網進去,找到下載連接連接到Github下載.zip文件
在文件下載目錄裏輸入命令解壓.zip文件
unzip openssl-master.zip
解壓完成後使用cd ./oenpssl-master
命令進入解壓文件的目錄中再使用ls
命令會看到這個文件裏有一個ReadMe
使用'./ReadMe'打開文檔,裏面有詳細的安裝教程
Quick Start快速開始
-----------If you want to just get on with it, do:若是你只是想快速上手作好使用準備,請執行如下操做:
$ ./config
$ make
$ make test
$ make install
[If any of these steps fails, see section Installation in Detail below.][若是這些步驟中的任何一個失敗,請參見下面的詳細安裝部分。]
步驟 | 耗時 | 百分比 |
---|---|---|
需求分析 | 10min | 8% |
設計 | 20min | 16% |
代碼實現 | 60min | 50% |
測試 | 10min | 8% |
總結分析 | 20min | 16% |
Linux中的./configure息
安裝openssl錯誤解決
fatal error: openssl/evp.h: 沒有那個文件或目錄
如何利用OpenSSL庫進行RSA加密和解密
使用Openssl的AES加密算法