客戶端:

1、 先創建一個socket,並與服務端建立起一般的socket連接

2、 調用openssl介面初始化SSL庫和SSL的錯誤信息,而SSL連接所需要使用到的三個主要的數據是:SSL *ssl; int socketfd; SSL_CTX *ctx;其中SSL_CTX對象用於設置所使用的SSL協議類型以及相關選項的設置,而SSL就是用於ssl連接的,並將socketfd和ctx與SSL對象建立關聯。

3、 利用SSL_connect函數來建立ssl連接,通過返回值判斷連接是否建立成功。

4、 之後就是使用ssl來讀寫數據,讀寫數據的時候一般都是先創建相應的數據結構體,且發送和接收端的位元組數一致(採用兼容性的數據類型),如下所示:

struct client2server {

uint32_t type;

char msg[MAX_LEN];

uint16_t keyword;

uint8_t rem[10];

}

再使用SSL_write(ssl, (void*)&data, sizeof(struct client2server));SSL寫入數據之後,應通過返回值來判斷SSL通信是否異常。若成功再利用SSL_read來讀取從服務端發送而來的數據。

5、 最後通信完成之後,應關閉socket,同時將ssl和ctx對象資源釋放清理

服務端:可利用boost庫的介面來實現與客戶端的會話連接,多線程並發。

若服務端要求客戶端支持證書認證(即在客戶端要求導入服務端的X509證書【公鑰】,並載入證書),具體導入證書的過程如下:

1.
先創建一個X509_STORE對象,再針對windows和linux進行不同的證書載入方式

a.
windows的,通過CertOpenSystemStore和CertEnumCertificatesInStore函數來打開系統證書及枚舉證書列表,再通過d2i_X509函數將之轉化為X509類型的證書對象,最後利用X509_STORE_add_cert函數將證書對象保存至X509_STORE對象中。

b.
在linux中,則通過直接找到linux中證書文件所存放的路徑和名稱,再利用X509_STORE_add_lookup來建立X509_LOOKUP對象並與X509_STORE對象關聯,最後利用X509_LOOKUP_load_file函數來載入證書。

2.
得到X509_STORE對象之後,利用SSL_CTX_set_cert_store函數將其保存到ctx中。

3.
制定證書的驗證方式以及深度

SSL_CTX_set_verify(ctx, SSL_VERIFY_PEER, verify_callback);

SSL_CTX_set_verify_depth(ctx, 100);

SSL_VERIFY_PEER用於客戶端時要求伺服器必須提供證書,用於伺服器時伺服器會發出證書請求消息要求客戶端提供證書,但是客戶端也可以不提供


推薦閱讀:
相關文章