SSL通訊流程函式封裝

2021-06-18 04:10:36 字數 2839 閱讀 1368

openssl

的api使用起來與我們常用的普通網路通訊函式

大同小異,主要分為初始化階段、金鑰

載入及驗證階段、建立ssl(類似於檔案描述符

(套結字

)建立函式socket)階段、繫結套結字階段(類似於bind函式)、請求建立連線階段(客戶端

特有,類似於connect)、接受連線請求階段(服務端

特有,類似於accept函式)、資料收發階段(類似於read和write)、結束連線階段以及結束監聽階段(類似於close)。為了讓ssl通訊過程更加清晰明了,故自己用c語言封裝了5個主要函式,讓ssl通訊流程為開發者快速掌握、一目了然。

ssl通訊流程函式封裝:

1、ssl初始化:

view plain

copy to clipboard

print?

int ssl_init(ssl_ctx *ctx)  

}  2、金鑰載入及驗證:

view plain

copy to clipboard

print?

int ssl_load(ssl_ctx *ctx, char *certificate, char *privatekey)  

/* 載入使用者私鑰 */

if (ssl_ctx_use_privatekey_file(ctx, privatekey, ssl_filetype_pem) <= 0)  

/* 檢查使用者私鑰是否正確 */

if (!ssl_ctx_check_private_key(ctx))  

}  3、服務端建立ssl物件並繫結套結字,接受指定埠(或指定位址

)的連線請求:

view plain

copy to clipboard

print?

int ssl_accept(ssl_ctx *ctx, int *sockfd, ssl **ssl, char *port, char *addr)  

bzero(&my_addr, sizeof(my_addr));  

my_addr.sin_family = pf_inet;  

my_addr.sin_port = htons(port);  

if (addr)  

my_addr.sin_addr.s_addr = inet_addr(addr);  

else

my_addr.sin_addr.s_addr = inaddr_any;  

if (bind(*sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr)) < 0)  

if (listen(*sockfd, 3) < 0)  

/* 等待客戶端連上來 */

bzero(&their_addr, sizeof(their_addrr));  

if ((new_fd = accept(sockfd, (struct sockaddr *) &their_addr, &len)) < 0)  

else

printf("server: got connection from %s, port %d,

socket %d\n",inet_ntoa(their_addr.sin_addr),  

ntohs(their_addr.sin_port), new_fd);  

/* 基於 ctx 產生乙個新的 ssl */

*ssl = ssl_new(ctx);  

/* 將連線使用者的 socket 加入到 ssl */

ssl_set_fd(*ssl, new_fd);  

/* 建立 ssl 連線 */

if (ssl_accept(*ssl) < 0)  

return new_fd;  

}  

4、客戶端建立ssl物件並繫結套結字,向指定埠、位址發起連線請求:

view plain

copy to clipboard

print?

int ssl_connect(ssl_ctx *ctx, int *sockfd, ssl **ssl, char *port, char *addr)  

/* 初始化伺服器端(對方)的位址和埠資訊 */

bzero(&dest, sizeof(dest));  

dest.sin_family = af_inet;  

dest.sin_port = htons(atoi(port));  

if (inet_aton(addr, (struct in_addr *) &dest.sin_addr.s_addr) == 0)  

/* 連線伺服器 */

if (connect(*sockfd, (struct sockaddr *) &dest, sizeof(dest)) < 0)  

/* 基於 ctx 產生乙個新的 ssl */

*ssl = ssl_new(ctx);  

ssl_set_fd(*ssl, *sockfd);  

/* 建立 ssl 連線 */

if (ssl_connect(*ssl) < 0)  

return 0;  

}  

5、資料收發階段採用ssl_read、ssl_write函式,用法跟read、write一樣,用ssl物件指標代替檔案描述符(套結字)即可。

6、結束連線階段以及結束監聽階段:

view plain

copy to clipboard

print?

int ssl_close(ssl_ctx *ctx, ssl *ssl, int sockfd, int new_fd)    

ssl 協議流程

最近在看公司的ssl協議實現,現將其流程總結如下 步驟解釋如下 1.client clienthello server。1 clienthello 訊息體 client.version 客戶端協議版本 clienthello.timestamp 客戶端時間戳 clienthello.random 客...

SSL通訊證書詳解

在https通訊中,客戶端需要驗證伺服器提供的數字證書。數字證書中包含了公鑰以及其他一些資訊。那麼數字證書中的引數是什麼意思呢?這裡列舉乙個證書 自簽名證書 生成證書的方式 1.版本 這個很好理解,就是證書的版本,目前通用的是v3 2.序列號 這個是用來標識某個證書的,也很好理解 3.簽名演算法 這...

Apache新增ssl的流程

apache新增 ssl的流程 1.首先保證安裝了 openssl 並且能夠在在終端執行它。2.為你的 apache 三倍 des 加密,pem 格式 建立乙個 rsa私鑰。openssl genrsa des3 out server.key 1024 請將你的 server.key 檔案備份,並且...