31.openssl编程——SSL实现
生活随笔
收集整理的這篇文章主要介紹了
31.openssl编程——SSL实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
31.1 概述SSL協議最先由netscape公司提出,包括sslv2和sslv3兩個版本。當前形成標準為tls協議(rfc2246規范)和DTLS(rfc4347,用于支持UDP協議)。sslv3和tls協議大致一樣。SSL協議能夠保證通信雙方的信道安全。他能提供數據加密、身份驗證以及消息完整性保護。SSL協議通過客戶端和服務端握手來協商各種算法和密鑰。31.2 openssl實現SSL協議源碼位于ssl目錄下。XXX_clnt.c:客戶端實現XXX_srvr.c:服務端實現XXX_enc.c:加密實現XXX_pkt.c:記錄協議實現XXX_meth.c:METHOD方法XXX_both.c:方法實現XXX_lib.c:對外提供的函數實現31.3 建立SSL測試環境a.建立自己的CA在openssl安裝目錄的misc目錄下,運行./CA.sh -newcab.生成客戶端和服務端正數申請openssl req -newkey rsa:1024 -out req1.pem -keyout sslclientkey.pemopenssl req -newkey rsa:1024 -out req2.pem -keyout sslserverkey.pemc.簽發客戶端和服務端正數openssl ca -in req1.pem -out sslclientcert.pemopenssl ca -in req2.pem -out sslservercert.pemd.運行ssl服務端和客戶端openssl s_server -cert sslservercert.pem -key sslserverkey.pem -CAfile cacert.pem -ssl3openssl s_client -ssl3 -CAfile cacert.pem31.4 數據結構ssl的主要數據結構定義在ssl.h中。SSL_CTX數據結構主要用于SSL握手前的環境準備,設置CA文件和目錄、設置SSL握手中的證書文件和私鑰、設置協議版本以及其他一些SSL握手時的選項。SSL數據結構主要用于SSL握手以及傳送應用數據。SSL_SESSION中保存了主密鑰、session id、讀寫加解密鑰、讀寫MAC密鑰等信息。SSL_CTX中緩存了所有SSL_SESSION信息,SSL中包含SSL_CTX。一般SSL_CTX的初始化在程序最開始調用,然后再生成SSL數據結構。由于SSL_CTX中緩存了所有的SESSION,新生成的SSL結構又包含SSL_CTX數據,所以通過SSL數據結構能查找以前用過的SESSION id,實現SESSION重用。31.5 加密套件一個加密套件指明了SSL握手階段和通信階段所應該采用的各種算法。算法:認證算法、密鑰交換算法、對稱算法和摘要算法。字符串的形式舉例:ALL:!ADH:RC4+RSA:+SSLv2:@STRENGTH。Openssl定義了4中選擇符號:“+”,“-”,“!”,“@”。其中,“+”表示取交集;“-”表示臨時刪除一個算法;“!”表示永久刪除一個算法;“@“表示了排序方法SSL建立鏈接之前,客戶端和服務器端用openssl函數來設置自己支持的加密套件。int SSL_set_cipher_list(SSL *s, const char *str);int SSL_CTX_set_cipher_list(SSL_CTX *ctx, const char *str)31.6 密鑰信息ssl中的密鑰相關信息包括:預主密鑰、主密鑰、讀解密密鑰及其iv、寫加密密鑰及其iv、讀MAC密鑰、寫MAC密鑰a.預主密鑰預主密鑰是主密鑰的計算來源。他由客戶端生成,采用服務端的公鑰加密發送給服務端。b.主密鑰主密鑰分別由客戶端和服務端根據預祝密鑰、客戶端隨機數和服務端隨機數生成,他們的主密鑰是相同的。主密鑰用于生成各種密鑰信息,它存放在SESSION數據結構中。c.對稱密鑰和MAC密鑰對稱密鑰(包括IV)和讀寫MAC密鑰通過主密鑰、客戶端隨機數和服務端隨機數生成。31.7 SESSION當客戶端和服務端在握手中新建session,服務端生成一個session ID,通過session ID,通過哈希表緩存SESSION信息,并通過server hello消息發送給客戶端。此ID是一個隨機數,SSL_v2版本長度為16字節,SSLv3和TLSv1長度為32字節。此ID語安全無關,但是在服務端必須是唯一的。當需要session重用時,客戶端發送包含session id的clientHello消息給服務端,服務端可用根據此ID來查詢緩存。session重用可以免去諸多SSL握手交互,特別是客戶端的公鑰加密和服務端的私鑰解密所帶來的性能開銷。session相關函數有a.int SSL_has_matching_session_id(const SSL *ssl, const unsgined char *id, unsigned int id_len)SSL中查詢session id, id和id_len為輸入的要查詢的session id,查詢哈希表b.int ssl_get_new_session(SSL *s, int session)生成ssl用的session,此函數可用被服務端或客戶端調用,當服務端調用時,傳入參數session為12,生成新的session;當客戶端調用時,傳入參數session為0c.int ssl_get_prev_session(SSL *s, unsigned char *session_id, int len)獲取以前用過的session id, 用于服務端session重用,本函數由服務端調用,session_id為輸入session ID首地址,len為其長度,如果返回1,表明要session重用,返回0,表示沒有找到,返回-1表示錯誤。d.int SSL_set_session(SSL *s, SSL_SESSION *session)設置session,本函數用于客戶端,用于設置session信息;如果輸入參數session為空值,他將置空s->session;如果不為空,他將輸入信息作為session信息。e.void SSL_CTX_flush_session清除超時的SESSION,輸入參數值t指定一個時間,如果t=0,則清楚所有SESSION,一般用time(NULL)去當前時間。詞函數調用了哈洗白哦函數lh_doall_arg來處理每一個SESSION數據f.int ssl_clear_bad_session(SSL *s)清除無效SESSION31.8 多線程支持編寫openssl多線程程序時,需要設置兩個回調函數:CRYPTO_set_id_callback((unsignec long(*))pthreas_thread_id);CRYPTO_set_locking_callback(void(*)()pthread_locking_callback);31.9 函數a.SSL_accept對應于socket函數accept,該函數在服務端調用,用來進行SSL握手b.int SSL_add_client_CA(SSL *ssl, X509 *x)添加客戶端CA名c.const char *SSL_alert_desc_string_long(int value)根據錯誤號得到錯誤原因d.SSL_check_private_key檢查SSL結構中的私鑰e.SSL_CIPHER_description獲取SSL加密套件描述f.SSL_CIPHER_get_bits獲取加密套件中對稱算法的加密長度g.SSL_CIPHER_get_name得到加密套件的名字h.SSL_CIPHER_get_version根據加密套件獲取SSL協議版本i.SSL_clear清除SSL結構j.SSL_connect對應于socket函數connect,該函數在客戶端調用,用來進行SSL握手k.SSL_CTX_add_client_CA給SSL_CTX添加客戶端CA.l.int SSL_CTX_add_session(SSL_CTX *ctx, SSL_SESSION *c)往SSL_CTX添加session.m.SSL_CTX_check_private_key檢查n.SSL_CTX_free釋放SSL_CTX空間o.long SSL_CTX_get_timeout(const SSL_CTX *s)獲取超時時間p.SSL_CTX_get_verify_callback獲取證書驗證回調函數q.SSL_CTX_verify_depth獲取證書驗證深度r.SSL_CTX_get_verify_mode獲取各個版本的客戶端和服務端的SSL方法。s.SSL_read讀取數據t.SSL_write發送數據u.SSL_get_current_compression獲取當前的壓縮算法的COMP_METHODv.SSL_COMP_get_name獲取壓縮解壓算法的名稱w.SSL_CTX_set/get_ex_data設置/讀取用戶擴展數據z.SSL_dup復制函數
轉載于:https://www.cnblogs.com/aixiaoxiaoyu/articles/8352168.html
總結
以上是生活随笔為你收集整理的31.openssl编程——SSL实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python·Jupyter Noteb
- 下一篇: PokeCats开发者日志(二)