我按照Turn a simple socket into an SSL socket中给出的答案在C中用SSL写了一个简单的Web服务器。当我使用SSL_write()时,这很好用。但是当我在服务器中使用sendfile()systemcall并使用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()?或者是否可以使用sendfile()替代SSL?
答案 0 :(得分:3)
使用OpenSSL,SSL状态保留在用户空间中,SSL_write
将根据此状态加密数据并更新状态,将加密数据放入SSL记录,然后将此SSL记录写入文件描述。使用sendfile
只是绕过所有这一切,并将普通的未加密数据直接写入文件描述符,与简单的write
而不是SSL_write
一样。这导致对等体接收普通数据而没有任何SSL记录容器。 peert将尝试将这些数据解释为SSL记录,并且会因为您看到的奇怪错误而失败。
答案 1 :(得分:2)
您有一种在sendsl中使用sendfile的方法。编译具有ktls支持的openSSL(在./config中提供enable-ktls选项)。这对4.13之后的任何Linux内核都适用。
然后使用刚刚构建的openssl编译应用程序。您应该可以将sendfile与SSL一起使用,并且应该可以像魅力一样工作。