非同步OpenSSL實現HTTPS心得
阿新 • • 發佈:2019-01-11
本文記錄在使用OpenSSL實現非同步式HTTPS中的一些心得體會。
1.關於握手
(1)如果沒有使用封裝庫,可以得到套接字描述符;而且非非同步系統,允許握手的阻塞,則直接使用API將套接字和OpenSSL繫結,從而完成SSL握手絕對是明智之選,可以省下很多麻煩。
(2)如果封裝之後得不到套接字描述符,或者要求非同步非阻塞,那麼使用SSL_SET_CONNECT配合SSL_read,再用SSL_do_handshake進行檢測即可實現,但是過程較為複雜,需要考慮諸多異常處理和邊界條件。
2.關於解密
SSL_read是一個很神奇的API,由於OpenSSL原始碼寫的和加密過一樣難懂(主要是不規範),所以想搞懂BIO_write進入BIO之後,SSL_read怎麼解密讀出來資料是一個很難得過程。這裡提兩點很關鍵、易錯的地方:
(1)不是每次寫入資料到BIO,SSL_read都會讀出來的。因為有時候它需要攢夠一定的位元組、亦或是資料恰好卡在某個無法解密的位置上,所以不要期待每次TCP收到後都立馬能解密出來。而是應該在這裡做好異常處理。
(2)SSL_read不是有多少資料就一次全部寫出來的。有可能每次只吐出來一點點。因此想要把BIO裡面的讀完,需要通過迴圈的方式實現。
3.關於加密
加密的API相對於解密來說其實並沒有太複雜,所見即所得。唯一的問題在於,握手階段千萬別忘了呼叫加密API,從而生成握手資訊,再進一步傳送出去,實現整個SSL握手過程。