openssl API網絡通訊

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庫的適配

*****************************************************************************************

相關文章
相關標籤/搜索