当客户端和服务端在握手中新建了session,服务端生成一个session ID,通过哈希表缓存SESSION信息,并通过server hello消息发送给客户端。此ID是一个随机数,SSL v2版本时长度为16字节,SSLv3和TLSv1长度为32字节。此ID与安全无关,但是在服务端必须是唯一的。当需要session重用时,客户端发送包含session id的clientHello消息(无sesion重用时,此值为空)给服务端,服务端可用根据此ID来查询缓存。session重用可以免去诸多SSL握手交互,特别是客户端的公钥加密和服务端的私钥解密所带来的性能开销。session的默认超时时间为60*5+4秒,5分钟。
session相关函数有:
1) int SSL_has_matching_session_id(const SSL *ssl, const unsigned char * id,unsigned int id_len)
SSL中查询session id,id和 id_len为输入的要查询的session id,查询哈希表ssl->ctx->sessions,如果匹配,返回1,否则返回0。
2) int ssl_get_new_session(SSL *s, int session)
生成ssl用的session,此函数可用被服务端或客户端调用,当服务端调用时,传入参数session为1,生成新的session;当客户端调用时,传入参数session为0,只是简单的将session id的长度设为0。
3) int ssl_get_prev_session(SSL *s, unsigned char *session_id, int len)
获取以前用过的session id,用于服务端session重用,本函数由服务端调用,session_id为输入senssion ID首地址,len为其长度,如果返回1,表明要session重用;返回0,表示没有找到;返回-1表示错误。
4) int SSL_set_session(SSL *s, SSL_SESSION *session)
设置session,本函数用于客户端,用于设置session信息;如果输入参数session为空值,它将置空s->session;如果不为空,它将输入信息作为session信息。
5) void SSL_CTX_flush_sessions(SSL_CTX *s, long t)
清除超时的SESSION,输入参数t指定一个时间,如果t=0,则清除所有SESSION,一般用time(NULL)取当前时间。此函数调用了哈希表函数lh_doall_arg来处理每一个SESSION数据。
6) int ssl_clear_bad_session(SSL *s)
清除无效SESSION。