[Security] openssl test (續三)

好的,先排除任何版本的bug,簡單解釋一下openssl程式的架構,其實我也不是很熟,只是為了硬加入一個功能,大致上簡單瞭解了一些,怕自己忘記,就把我瞭解的紀錄下來了。

在openssl的程式目錄中,各種加密的方式在crypto/下都有獨立的目錄,但是把這些加密方式串連起來的核心是在apps/和ssl/目錄下的程式。

但,如果你是直接呼叫openssl library的人,基本上是用不到apps/下的東西,因為apps下的程式,通常是給在系統下要呼叫openssl的命令去進行一些簡單的測試。

先提一下...
由於openssl是在網路封包上,將Data channel的部分透過加密後,再封裝至socket中,我指的socket就是網路程式的一個介面,必須經過create socket -> bind socket -> listen socket -> accept socket,才能完成一條跟Client互相溝通的Session。

當然這個過程socket自然就會跟network的driver進行互動了。而openssl為了將加密後的封包包入socket中,自然他就會有自己的socket library,而我們只要透過ssl_read或ssl_write的方式就能透過已經建立的加密連線去丟送封包。

好的,接下來就是我真正想講的重點了。假定你是使用linux的user,那你呼叫openssl的命令時,其實你就是呼叫了apps/openssl.c這隻程式的main function,進而帶入參數後,它就會再跳轉到你帶入參數的下一隻程式中。

比如我們先前的Command是#openssl s_server xxxxx....
它就會先進到openssl.c的main function中,再帶轉到s_server.c的程式中,而s_server跟s_client也就在apps下的s_server.c跟s_client.c。

我簡單拉出幾個openssl s_server從init到等待client中間會用到的幾個重要function。

Server -
apps/s_server.c : MAIN()
>  meth=SSLv23_server_method(), SSLv3_server_method(), SSLv2_server_method()
"" parsing input argv .. ""
>  ctx=SSL_CTX_new(meth);
>  SSL_CTX_set_options(ctx,off);
>  if (socket_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx, 1);
>  if (cipher != NULL) if(!SSL_CTX_set_cipher_list(ctx,cipher))
>  if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback);
>  SSL_CTX_sess_set_cache_size(ctx,128);
>  SSL_CTX_set_psk_server_callback(ctx, psk_server_cb);
        >  if (!SSL_CTX_use_psk_identity_hint(ctx, psk_identity_hint))
>  SSL_CTX_set_cipher_list(ctx,cipher)
>  SSL_CTX_set_verify(ctx,s_server_verify,verify_callback);
>  SSL_CTX_set_session_id_context(ctx,(void*)&s_server_session_id_context,sizeof s_server_session_id_context);
>> if (CAfile != NULL) SSL_CTX_set_client_CA_list(ctx,SSL_load_client_CA_file(CAfile));
>  do_server(port,socket_type,&accept_socket,sv_body, context);

ssl/s3_srvr.c : ssl3_accept()
ssl/s3_srvr.c : ssl3_get_client_hello()

----------------------------------->>>
而s_client.c的則是:

Client -
apps/s_client.c : MAIN()
>  meth=SSLv23_client_method(), meth=SSLv3_client_method(), meth=SSLv2_client_method()
"" parsing input argv .. ""
>  ctx=SSL_CTX_new(meth);
>  SSL_CTX_set_psk_client_callback(ctx, psk_client_cb);
>  SSL_CTX_set_options(ctx,off);
>  if (sock_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx, 1);
>  if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback);
>  if (cipher != NULL) if(!SSL_CTX_set_cipher_list(ctx,cipher))
>  con=SSL_new(ctx);
>  init_client(&s,host,port,sock_type)
>  ### ssl socket flow ###

其實透過這幾個函式,我們就可以簡單猜到在一個openssl server的函式建立跟client的函式使用,大概會用到那幾個程式。不過我建議是,在進行程式撰寫前,可以先試試Linux下的Command,確定無誤,再進行程式撰寫,這樣你就能夠透過s_server和s_client裡面的程式,來撰寫你需要的openssl程式了。

看完系統下的指令程式後,大家想再深入瞭解,我會建議各位從ssl的目錄下開始著手,因為透過ssl下的程式,會再引入其他的加密方式,等於說ssl下的程式才是個真正openssl的起點。所以當初我要將dtls的功能加到openssl 0.9.8i中時,也是從ssl/下開始著手。

真的很抱歉呀,各位。我大致上也只能帶到這裡,再深入我也不是很瞭解了...。




留言

這個網誌中的熱門文章

[Security] wpa_supplicant setup

[Wordpress] 登出時出現 404 Error

[OpenNMS Note] OpenNMS SNMP的誕生