socket網路編程與openssl的結合
客戶端:
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用於客戶端時要求伺服器必須提供證書,用於伺服器時伺服器會發出證書請求消息要求客戶端提供證書,但是客戶端也可以不提供
推薦閱讀: