这里介绍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,错误