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 檔案備份,並且...