好的,先排除任何版本的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(