使用ssl_write()发数据时能否访问其写入缓冲区并获取内容与大小
访问ssl_write()完成写入后缓冲区的可行性说明
该操作无法通过OpenSSL公开的官方接口直接实现,具体原因及替代方案如下:
- OpenSSL中
SSL_write()涉及的明文缓存、加密后TLS记录缓存都属于libssl库的内部私有数据,没有对外暴露可直接读取内容、查询占用大小的公开API。这是OpenSSL的有意设计,目的是避免外部操作干扰TLS状态机运行,降低安全风险。 - 你调用
SSL_write()时传入的原始数据缓冲区本身就是由你自己的业务代码分配管理的,如果你需要留存发送的内容、发送长度,直接在调用SSL_write()之前自行拷贝、记录对应参数即可,完全不需要从OpenSSL内部缓冲区获取。 - 如果你需要确认本次调用实际成功写入的明文字节数,直接读取
SSL_write()的返回值即可。如果返回值小于你传入的待写入长度,说明内核发送缓冲区已满,需要后续重试写入剩余内容,你可以自行维护偏移量统计累计成功发送的总长度。 - 如果你有特殊需求需要拿到加密后的TLS记录内容,也不要尝试访问内部缓冲区,可以通过OpenSSL的自定义BIO回调机制实现:自定义写操作的BIO钩子,所有发往网络的加密数据都会先经过你自定义的回调,你可以在回调中直接获取加密后的内容、对应长度,不会影响TLS链路的正常运行。
注意:不要尝试通过强制类型转换访问SSL结构体的私有成员获取缓冲区,不同OpenSSL版本的结构体布局差异极大,这类代码兼容性极差,升级OpenSSL版本后大概率直接崩溃,还可能引入内存安全漏洞。
内容的提问来源于stack exchange,提问作者tryingBetter
相关产品推荐
相关产品推荐

