c - 将 sendfile() 与 SSL 结合使用时出现问题

标签 c ssl https openssl

我遵循了 Turn a simple socket into an SSL socket 中给出的答案使用 SSL 用 C 语言编写一个简单的 Web 服务器。这在我使用 SSL_write() 时工作​​正常。但是当我在我的服务器中使用 sendfile() 系统调用并使用 firefox 访问页面时,firefox 显示以下错误

Secure Connection Failed
An error occurred during a connection to localhost:16000. SSL received a record that exceeded the maximum permissible length. Error code: SSL_ERROR_RX_RECORD_TOO_LONG

当我使用 SSL_write() 发送 html 页面的内容时,内容毫无问题地显示在浏览器中。但是当我使用 sendfile() 时出现问题。所以据我所知, sendfile() 导致了这个错误。

我想将文件的内容直接发送到套接字(例如 HTML 页面、图像等)。有人可以告诉我如何纠正此错误并使用 sendfile() 吗?或者我可以使用 SSL 替代 sendfile() 吗?

最佳答案

使用 OpenSSL,SSL 状态保存在用户空间,SSL_write 将根据此状态加密数据并更新状态,将加密数据放入 SSL 记录,然后写入此 SSL 记录到文件描述符。使用 sendfile 只是绕过所有这些并将普通的未加密数据直接写入文件描述符,与简单的 write 而不是 SSL_write 一样做。这导致对等方接收没有任何 SSL 记录容器的纯数据。 peert 将尝试将这些数据解释为 SSL 记录并失败,并出现您所看到的奇怪错误。

关于c - 将 sendfile() 与 SSL 结合使用时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50792406/

相关文章:

c - 比 : execlp(cmd[0], cmd[0], cmd[1] cmd[2], cmd[3] NULL) 更有效的方法;

c++ - 程序运行良好数小时,最终出现内存地址 0x10 的段错误

amazon-web-services - AWS Certificate Manager 证书对控制台中的 AWS Beanstalk 不可见

c# - 使用 IP 而不是 localhost ASP.Net 和 SSL

c - Clock_t 和 time_t 或 time(NULL) 和 Clock() 之间的区别

c - https 使用 libcurl vs golang

jsp - 使用 Spring Security 将 https 卸载到负载均衡器

tomcat - 请求 header 正在转换为大写

python - Websocket 握手状态 200 异常

ssl - 无需证书验证即可进行 httpS 连接的 kotlin 库(如 curl --insecure)