用openssl進行SSL程式設計

2021-03-31 22:37:17 字數 3006 閱讀 2346

主要介紹openssl進行ssl通訊的一些函式以及過程,主要是初始化過程,至於資料的接收以及後續處理可以具體問題具體分析。

load所有的ssl演算法

openssl_add_ssl_algorithms();

建立ssl所用的method

ssl_method *meth=sslv23_method();

初始化上下文情景

ssl_ctx *ctx=ssl_ctx_new(meth);

ret->quiet_shutdown=1;預設的是ret->quiet_shutdown=0;他相當於ssl_set_shutdown函式將引數設定為ssl_sent_shutdown|ssl_received_shutdown

當設定為1時,假如關閉後,不通知對方,這樣不適合tls標準

ssl_ctx_set_quiet_shutdown(ctx,1);

ctx->options|=ssl_op_all,ssl/tls有幾個公認的bug,這樣設定會使出錯的可能更小

ssl_ctx_set_options(ctx,ssl_op_all);

設定cache的大小,預設的為1024*20=20000,這個也就是可以存多少個session_id,一般都不需要更改的。假如為0的話將是無限

ssl_ctx_sess_set_cache_size(ctx,128);

ssl_ctx_load_verify_locations用於載入受信任的ca證書,cafile如果不為null,則他指向的檔案包含pem編碼格式的乙個或多個證書,可以用e.g.來簡要介紹證書內容

capath如果不為null,則它指向乙個包含pem格式的ca證書的目錄,目錄中每個檔案包含乙份ca證書,檔名是證書中ca名的hash值

可以用c-rehash來建立該目錄,如cd /some/where/certs(包含了很多可信任的ca證書) c_rehash .。返回一成功,0 失敗。ssl_ctx_set_default_verify_paths找尋預設的驗證路徑,在這裡肯定找不到的。

這裡主要set cert_store

char *cafile=null,*capath=null;

ssl_ctx_load_verify_locations(ctx,cafile,capath);

當需要客戶端驗證的時候,伺服器把cafile裡面的可信任ca證書發往客戶端。

if(cafile !=null )ssl_ctx_set_client_ca_list(ctx,ssl_load_client_ca_file(cafile));

設定最大的驗證使用者證書的上級數。

ssl_ctx_set_verify_depth(ctx,10);

當使用rsa演算法鑑別的時候,會有乙個臨時的dh金鑰磋商發生。這樣會話資料將用這個臨時的金鑰加密,而證書中的金鑰中做為簽名。

所以這樣增強了安全性,臨時金鑰是在會話結束消失的,所以就是獲取了全部資訊也無法把通訊內容給解密出來。

static unsigned char dh512_p=;

static unsigned char dh512_g=;

dh *dh=dh_new();

dh->p=bn_bin2bn(dh512_p,sizeof(dh512_p),null);

dh->g=bn_bin2bn(dh512_g,sizeof(dh512_g),null);

ssl_ctx_set_tmp_dh(ctx,dh);

下面載入伺服器的證書和私鑰,私鑰可以和證書在乙個檔案之中。判斷私鑰和證書是否匹配。

char *s_cert_file="server.pem";

char *s_key_file=null;

ssl_ctx_use_certificate_file(ctx,s_cert_file,ssl_filetype_pem);

獲取私鑰之前先把私鑰的密碼給寫上

char *pkeypasswd="serve";

ssl_ctx_set_default_passwd_cb_userdata(ctx, pkeypasswd);

ssl_ctx_use_privatekey_file(ctx,s_cert_file,ssl_filetype_pem);

ssl_ctx_check_private_key(ctx);

設定乙個臨時的rsa,在出口演算法中,有規定需要這麼做的。

rsa *rsa=rsa_generate_key(512,rsa_f4,null,null);

ssl_ctx_set_tmp_rsa(ctx,rsa);

用於設定驗證方式。s_server_verify是以下值的邏輯或

ssl_verify_none表示不驗證,ssl_verify_peer用於客戶端時要求伺服器必須提供證書,用於伺服器時伺服器會發出證書請求訊息要求客戶端提供證書,但是客戶端也可以不提供

ssl_verigy_fail_if_no_peer_cert只適用於伺服器且必須提供證書。他必須與ssl_verify_peer一起使用

當ssl_verify_peer被設定時verify_callback可以控制驗證的行為。任何乙個驗證失敗資訊都會終止tls連線

static int s_server_verify=ssl_verify_none;

ssl_ctx_set_verify(ctx,ssl_verify_peer,null/*verify_callback*/);

為了從自己本身的程式中產生乙個session_id,所以要給本程式設定乙個session_id_context,否則程式從外部獲取session_id_context來得到session_id,那很容易產生錯誤

長度不能大於ssl_max_ssl_session_id_length

const unsigned char s_server_session_id_context[100]="1111asdfd";

ssl_ctx_set_session_id_context(ctx,s_server_session_id_context,sizeof s_server_session_id_context);

return ctx;

用openssl為apache製作ssl證書

步驟1 生成金鑰 命令 openssl genrsa 1024 server.key 說明 這是用128位rsa演算法生成金鑰,得到server.key檔案 步驟2 生成證書請求 命令 openssl req new key server.key server.csr 說明 這是用步驟1的金鑰生成證...

SSL 用OpenSSL命令列生成證書檔案

ssl 用openssl命令列生成證書檔案 來自csdn,稍微增補了一下 也許很多人和本人一樣深有體會,使用openssl庫寫乙個加密通訊過程,很容易就寫出來了,可是整個工作卻花了了好幾天。除將程式編譯成功外 沒有可以使用的證書檔案,編譯成功了,它並不能跑起來,並不表示它能正常使用,所以.還需生成必...

OpenSSL進行SSL通訊的一些問題

這兩個星期真是被openssl給煩透了,幾個很簡單基本的問題 如果沒人告訴你真的很難測出來 把我搞的。哎,有時候真是不知道自己該不該搞技術,發現自己頭腦真是蠢得很。直接上正題。第乙個問題 前面講過openssl可以使用windows下的capi引擎 我也不太清楚是從哪個版本開始後就開始支援了,網上說...