這里介紹SSL_shutdown這個API。其目的是關閉一個TLS/SSL的連接。
這個API會發送'close notify'這個shutdown alert給對端來關閉TLS/SSL連接。但不管操作是否成功,連接都會被設置為SSL_SENT_SHUTDOWN標志,并且這個連接被認為是關閉了,而且放到session緩存中重用。
shutdown過程由兩個步驟組成:
1.發送close notify shutdown alert
2.接收對方的close notify shutdown alert.
根據TLS標準,應用程序只發送shutdown alert并且關閉底層連接而不等待對方的響應是允許的(這種方式可以讓進程資源更好利用)。當底層連接用于其它通訊,完整的shutdown程序(雙向的close notify)必須被執行,從而保證兩邊同步。
SSL_shutdown支持單向和雙向關閉,如下:
當應用程序是第一部分發送close notify alert, ssl_shutdown 僅僅發送alert并且設置SSL_SENT_SHUTDOWN標志,而SSL_shutdown本身返回0表示成功。如果一個單向的關閉就足夠了,第一個SSL_shutdown就足夠了。為了完成雙向的關閉握手,SSL_shutdown必須被再次調用。第二次調用將讓SSL_shutdown等待對端的close notify。如果成功了,第二個SSL_shutdown會范圍1.
如果對方已經發送來close notify,并且SSL_RECEIVED_SHUTDOWN被設置,SSL_shutdown將發送close notify標致,并設置SSL_SEND_SHUTDOWN然后立即返回1.這個標志可以通過SSL_get_shutdown來檢查。
因此推薦檢查SSL_shutdown的返回值,并再次調用SSL_shutdown。
SSL_shutdown的行為也依賴于底層BIO(socket).
如果是阻塞BIO, SSL_shutdown會在握手完成或錯誤出現時返回。如果是非阻塞,SSL_shutdown會在底層BIO不能滿足需要的時候返回,可以通過SSL_get_error來檢查。
返回值:
1.執行成功
0,單向關閉
-1,錯誤