使用socket實現SSL安全訪問介紹

2021-06-27 03:27:24 字數 2876 閱讀 2248

最近看了點使用openssl庫函式進行socket安全訪問的內容,小結如下:

(1)**流程如下圖所示

(2)互動流程

(3)libssl的api介紹

ssl庫初始化——準備好可呼叫的函式,但函式都未呼叫,直到ssl上下文建立

ssl_library_init()

載入所有ssl演算法

openssl_add_all_algorithms()

載入所有ssl錯誤

ssl_load_error_strings()

選擇ssl互動協議

ssl_method*tlsv1_server_method(void);    /* tlsv1.0 */

ssl_method*tlsv1_client_method(void);    /* tlsv1.0 */

ssl_method*sslv2_server_method(void);    /* sslv2 */

ssl_method*sslv2_client_method(void);    /* sslv2 */

ssl_method*sslv3_server_method(void);    /* sslv3 */

ssl_method*sslv3_client_method(void);    /* sslv3 */

ssl_method*sslv23_server_method(void);    /* sslv3 but can rollback to v2 */

ssl_method *sslv23_client_method(void);   /* sslv3 but can rollback to v2 */

建立ssl上下文——可理解文建立乙個ssl執行環境

ssl_ctx* ssl_ctx_new(ssl_method*sslmethod)

載入使用者的數字證書, 此證書用來傳送給客戶端。 證書裡包含有公鑰

int ssl_ctx_use_certificate_file(ssl_ctx *ctx, const char *file, int type)

載入使用者私鑰

int ssl_ctx_use_privatekey_file(ssl_ctx *ctx, const char *file, int type)

檢驗一下證書與私鑰是否配對

intssl_ctx_check_private_key(ssl_ctx *ctx)

基於ssl上下文,新建乙個ssl鏈結

ssl* ssl_new(ssl_ctx* sslctx)

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

ssl_set_fd(ssl*ssl, int sockfd)

服務端sockfd需bind、listen和accept

客戶端sockfd需connect到伺服器

即ssl握手過程,是在普通的tcp建鏈完成後再進行的。

服務端開啟ssl會話

ssl_accept(ssl* ssl)

客戶端啟動ssl握手

ssl_connect(ssl*ssl)

ssl收包

ssl_read(ssl* ssl,char*buffer,int maxbuf)

ssl發包

ssl_write(ssl* ssl,char*buffer,int buf_len)

載入ca證書

int ssl_ctx_load_verify_locations(ssl_ctx *ctx, const char *cafile, const char *capath)

設定驗證方式

voidssl_ctx_set_verify(ssl_ctx *ctx,int mode,int (*callback)(int, x509_store_ctx *))

mode取值:

ssl_verify_none

服務端:不會認證客戶端身份,客戶端不會發證書到服務端

客戶端:伺服器的證書會被驗證,但是驗證結果不影響ssl握手

ssl_verify_peer

雙方都會傳送自己的證書,也都會驗證對方證書,如果有一方驗證不合法,ssl握手立刻停止

ssl_verify_fail_if_no_peer_cert

只用在服務端,如果客戶端沒有提供自身的證書,則ssl會話結束,該模式需要與上個模式共同使用

ssl_verify_client_once

只用在服務端,只對客戶端在第一次ssl協商時要證書,後面重新協商時不會驗證證書

獲取對方的證書

x509* ssl_get_peer_certificate (ssl* ssl)

錯誤日誌列印

err_print_errors_fp(stderr)

關閉ssl連線

int ssl_shutdown(ssl *ssl)

釋放ssl連線

int ssl_free(ssl*ssl)

釋放ssl上下文

int ssl_ctx_free(ssl_ctx *ctx)

設定私鑰密碼

void ssl_ctx_set_default_passwd_cb_userdata(ssl_ctx *ctx,void *pwd)

(4)使用注意事項

客戶端建立的普通socket連線在使用ssl_connect()連線上伺服器之前,不要進行資料的傳送,否則會導致ssl_connect()呼叫失敗,ssl會話終止。

SSL安全協議實現的過程

ssl對通訊的對話過程進行安全保護 1.接通隊段 客戶機通過網路向伺服器打招呼,伺服器回應.2.密碼交換階段 客戶機與伺服器之間交換雙方認可的密碼,一般選用rsa密碼演算法,也有的選用diffie hellmanf和fortezza kea密碼演算法 3.會談密碼階段 客戶機與伺服器之間彼此交談的會...

使用 WCF 實現 SSL

http 傳輸安全 或 ssl 到 wcf 外部提供。可以使用兩種方式之一來實現 ssl 決定因素是承載應用程式的方式 iis 7.0 若要為安全宿主 使用 ssl 設定 iis 7.0,請參閱iis 7.0 中配置安全套接字層。若要配置使用的證書與 iis 7.0,請參閱iis 7.0 中配置伺服...

使用安全SSL連線PostgreSQL資料庫

2020年4月8日15 29 47 今天主要是在postgresql資料庫上面遇到的乙個要求 配置ssl方式連線資料庫,連線後檢視版本正確。ssl 的英文全稱是 secure sockets layer 中文名為 安全套接層協議層 它是網景 netscape 公司提出的基於 web 應用的安全協議。...