現在 HTTPS 的普及率是越來越高,閑來無事,花了二三天時間,為五年前寫的 aioserver 服務器提供了 SSL 訪問支持。
查看網上資料,為了提高服務器的高並發,建議使用:SSLEngine
網上搜索了一些關於 SSLEngine 的使用資料,看了后就照葫蘆畫瓢,開工。
其間一個問題困擾了我好幾個小時,在進行SSL握手的時候:
doUnwrap() 解包后, 有 2 種情況:
1. 多數情況下: new HandshakeStatus: NEED_WRAP -> wrap() -> 完成 SSL 握手。
2. 少數情況下: new HandshakeStatus: NOT_HANDSHAKING (已完成 SSL 握手)
其中, 當 new HandshakeStatus: NOT_HANDSHAKING, 又有 2 種可能情況:
1. netIn.remaining() > 0: 接收到的數據中包含了 HTTP Header 請求頭
2. netIn.remaining() = 0: 不包含 HTTP Header 請求頭
我們需要對關於SSL握手協議過程中出現的不同情況進行不同的處理。
另外,我到現在還不清楚的地方:所有的請求共享一個 SSLEngine,還是根據每一個請求創建一個 SSLEngine: sslContext.createSSLEngine() ???
目前我的代碼中是根據每一個請求創建一個 SSLEngine: sslContext.createSSLEngine()