在握手流程中,openssl 提供了几个回调函数接口让我们介入,最主要的接口有这么几个:
client_hello_cb、get_session_cb、servername_cb、cert_cb。
client_hello_cb 是收到 ClientHello 消息后执行的第一个回调,然后选择协议版本和选择密钥套件,接着调用 get_session_cb 来获取缓存的 Session,在这个阶段我们可以做分布式缓存的获取,解决分布式环境中Session ID复用率低的问题。
openssl 解析完SNI后调用 servername_cb,这个回调主要用来切换 server 块配置和 SSL_CTX,实现多个 server 块不同 SSL 配置的问题,但可以看出协议版本和密钥套件早已经选择好了,在这个阶段做 SSL_CTX 切换对这两个配置并没有作用。
最后调用 cert_cb 来切换证书,在这个阶段可以用 lua 介入,实现证书的热加载。
要想实现协议版本和密钥套件域名定制的话,必须要在 client_hello_cb 这个阶段进行切换,但是 client_hello_cb 这个回调是新版 openssl 才支持。
网友评论