异步OpenSSL实现HTTPS心得

  本文记录在使用OpenSSL实现异步式HTTPS中的一些心得体会。

1.关于握手

(1)如果没有使用封装库,可以得到套接字描述符;而且非异步系统,允许握手的阻塞,则直接使用API将套接字和OpenSSL绑定,从而完成SSL握手绝对是明智之选,可以省下很多麻烦。

(2)如果封装之后得不到套接字描述符,或者要求异步非阻塞,那么使用SSL_SET_CONNECT配合SSL_read,再用SSL_do_handshake进行检测即可实现,但是过程较为复杂,需要考虑诸多异常处理和边界条件。


2.关于解密

  SSL_read是一个很神奇的API,由于OpenSSL源码写的和加密过一样难懂(主要是不规范),所以想搞懂BIO_write进入BIO之后,SSL_read怎么解密读出来数据是一个很难得过程。这里提两点很关键、易错的地方:

(1)不是每次写入数据到BIO,SSL_read都会读出来的。因为有时候它需要攒够一定的字节、亦或是数据恰好卡在某个无法解密的位置上,所以不要期待每次TCP收到后都立马能解密出来。而是应该在这里做好异常处理。

(2)SSL_read不是有多少数据就一次全部写出来的。有可能每次只吐出来一点点。因此想要把BIO里面的读完,需要通过循环的方式实现。


3.关于加密

  加密的API相对于解密来说其实并没有太复杂,所见即所得。唯一的问题在于,握手阶段千万别忘了调用加密API,从而生成握手信息,再进一步发送出去,实现整个SSL握手过程。

猜你喜欢

转载自blog.csdn.net/u013354486/article/details/81462311