You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过文件描述符使用OpenSSL读写加密数据?

如何统一OpenSSL加密与非加密连接的I/O操作?

我不确定这是不是和OpenSSL交互的常规方式,也找不到相关示例或参考。我有一批通过文件描述符和多种对象交互的应用,这种方式在明文TCP套接字上表现很好,直接用标准库函数读写就行。之前用SSL_write和SSL_read处理加密连接,感觉特别繁琐。

我的目标是统一处理加密或非加密连接的I/O操作。目前的做法需要同时传递加密连接的SSL *ssl和非加密连接的普通文件描述符,还要根据连接类型选择对应的I/O函数,而且不是所有函数都有SSL等效实现。比如下面的宏定义就体现了这种尴尬:

#ifdef HAVE_SSL_RECV
#define my_recv(ssl, fd, buf, len, flags) (ssl ? SSL_recv(ssl, buf, len, flags) : recv(fd, buf, len, flags))
#endif
#define my_read(ssl, fd, buf, len) (ssl ? SSL_read(ssl, buf, len) : read(fd, buf, len))
#define my_write(ssl, fd, buf, len) (ssl ? SSL_write(ssl, buf, len) : write(fd, buf, len))

我希望能拿到一个指向SSL连接解密端的文件描述符,读写这个描述符时自动完成加解密,效果和调用SSL_read、SSL_write完全一样。但我不知道OpenSSL有没有内置或标准方法实现这一点。

之前看到过BIO对的相关讨论,但查了手册后觉得这不是我要的——BIO对会做缓冲,而我完全不需要这个功能。

我还试过OpenSSL的SSL_get_wfd和SSL_get_rfd函数,原本以为这就是我要找的,但实际它们返回的是原始套接字文件描述符,和当初传给SSL_set_fd的FD完全一样(已经打印三个FD确认过),我甚至搞不懂这些函数的意义何在,根本没提供新信息。

我当然可以手动实现:创建管道,把管道一端作为读写用的文件描述符,再启动一个线程从管道读写并转发到对应的SSL函数,以此抽象掉TLS连接的存在。但我想确认有没有更好或更标准的方法,能避免为每个SSL连接额外创建线程的开销?(如果没有也没关系,但我想在采用这个方案前搞清楚。)

内容的提问来源于stack exchange,提问作者InterLinked

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 10:01:42