1.本文是在別人的基礎上,通過測試,大致總結的。操做環境ubuntu12和ubuntu14算法
*****************************************************************************************
"網絡通訊加密"
頭文件:
#include <openssl/ssl.h>
#include <openssl/err.h>ubuntu
OpenSSL流程和函數介紹服務器
1.ssl庫的初始化
int SSL_Library_init (void);網絡
2.載入ssl全部的算法
void OpenSSL_add_all_algorithms(); 異步
3.載入ssl全部的錯誤信息
void SSL_load_error_strings();socket
4.選擇會話協議
在利用OpenSSL開始SSL會話以前,須要爲客戶端和服務器制定本次會話採用的協議,目前可以使用的協議包括TLSv1.0、SSLv二、SSLv三、SSLv2/v3。
須要注意的是,客戶端和服務器必須使用相互兼容的協議,不然SSL會話將沒法正常進行。
OpenSSL中一個會話的環境稱爲「 CTX 」,申請CTX的函數是; const SSL_METHOD *SSLv23_client_method (void);
SSL_CTX *SSL_CTX_new (SSL_METHOD *method); //例如:SSL_CTX_new(SSLv23_server_method());函數
5.加載用戶私鑰:
1)有兩種方式:私鑰有密碼, 私鑰無密碼
int SSL_CTX_use_Private_file (SSL_CTX *ctx, const char *file, int type); //例如:SSL_CTX_use_PrivateKey_file(tmp_ctx, privateKey, SSL_FILETYPE_PEM)測試
2)當私鑰有密碼時,獲取私鑰以前先把私鑰的密碼給寫上
char *pKeyPasswd="serve";
SSL_CTX_set_default_passwd_cb_userdata(ctx, pKeyPasswd);
SSL_CTX_use_PrivateKey_file(ctx,s_cert_file,SSL_FILETYPE_PEM);
加密
6.加載用戶證書:
int SSL_CTX_use_certificate_file (SSL_CTX *ctx, const char *file, int type); //例如:SSL_CTX_use_certificate_file(tmp_ctx, certificate, SSL_FILETYPE_PEM)server
7.驗證私鑰和證書是否相等
int SSL_CTX_check_private_key (SSL_CTX *ctx);
8.使用socket綁定SSL套接字:
int SSL_set_fd (SSL *ssl, int fd);
int SSL_set_rfd (SSL *ssl, int fd); // 只讀
int SSL_set_wfd (SSL *ssl, int fd); // 只寫
注意:上述三個函數成功時返回TRUE,失敗時返回FALSE
9.完成SSL握手
int SSL_connect (SSL *ssl); // 用於client
int SSL_accept (SSL *ssl); // 用於server
10.從SSL套接字中提取對方的證書信息
X509 *SSL_get_peer_certificate (SSL *ssl);
11.獲取證書全部者的名字:
X509_NAME *X509_get_subject_name (X509 *a);
12.數據傳輸
int SSL_read (SSL *ssl, void *buf, int num);
int SSL_write (SSL *ssl, const void *buf, int num);
13.結束SSL通訊
關閉SSL套接字
int SSL_shutdown (SSL *ssl);
釋放SSL套接字
void SSL_free (SSL *ssl);
釋放SSL會話
void SSL_CTX_free (SSL_CTX *ctx);
14.注意:注意
OpenSSL庫中,各個函數的返回值的格式並不統一(有些用0表示失敗,有些用0表示成功),請注意區分
用在OpenSSL的fd 不能 設置爲 nonblock ,不然在 SSL_connect 時會失敗——感受這一點限制了OpenSSL與除了 libevent 以外其餘異步I/O庫的適配
*****************************************************************************************