Linux 使用libssl和sendmsg()SCM_权限实现SSL服务器

Linux 使用libssl和sendmsg()SCM_权限实现SSL服务器,linux,openssl,nph,Linux,Openssl,Nph,我现在想知道我们是否可以在Linux环境下基于以下策略/方案制作某种SSL服务器 (1) 对于初始请求,它应该在父服务器进程中传入。在建立SSL连接并处理请求的初始解析之后,请求(套接字)将被转发到请求处理进程以进行进一步处理 (2) 请求处理过程应该是预先运行的。从这个意义上讲,我们不会使用任何基于fork-exec管道的方案 (3) 对于父服务器进程和请求处理进程之间的通信,已经建立了一些IPC,以便使用sendmsg()-SCM_权限技术将打开的套接字描述符从父服务器进程复制到请求处理进程

我现在想知道我们是否可以在Linux环境下基于以下策略/方案制作某种SSL服务器

(1) 对于初始请求,它应该在父服务器进程中传入。在建立SSL连接并处理请求的初始解析之后,请求(套接字)将被转发到请求处理进程以进行进一步处理

(2) 请求处理过程应该是预先运行的。从这个意义上讲,我们不会使用任何基于fork-exec管道的方案

(3) 对于父服务器进程和请求处理进程之间的通信,已经建立了一些IPC,以便使用sendmsg()-SCM_权限技术将打开的套接字描述符从父服务器进程复制到请求处理进程

(4) 就SSL功能而言,我们应该使用OpenSSL(libssl)

(5) 在请求处理过程中,我们应该通过使用父服务器进程中的共享套接字描述符来创建新的SSL套接字

关键是我不想浪费在服务器和请求处理过程之间传输数据的任何性能。我也不想根据请求生成请求处理过程。因此,我希望提前生成请求处理过程


虽然我不确定我在这里所做的是否对您有意义,但如果您中的任何人能给我一些提示,说明上述方法是否可行,我们将不胜感激。

不清楚您到底在寻找什么,特别是您想在哪里进行SSL加密/解密

是否要在请求处理程序进程内进行加密/解密?
这似乎是更可能的解释。然而,您谈论的是在主进程中进行一些请求解析。主进程中解析的数据是否已经是SSL会话的一部分?如果是这样,您必须在主进程中执行SSL握手(初始化和密钥交换),以便访问加密数据。如果随后将原始套接字传递给另一个进程,它将无法访问父进程的SSL状态,因此无法继续解密父进程中断的位置。如果它试图重新初始化套接字上的SSL,就好像它是一个干净的连接一样,客户端可能(正确地)将连接中的一个未经请求的握手当作协议错误对待,并终止连接。如果没有,则会出现一个安全漏洞,因为攻击者可能会恶意重定向客户端的网络流量,而不是您的请求处理过程,从而强制重新初始化。通常不可能将初始化的SSL会话传递给不同的进程,而不同时通知它们OpenSSL的完整内部状态(交换的密钥、一些序列号等),这即使不是不可能,也是很困难的

如果您不需要在父进程中接触SSL会话,并且只解析在实际SSL会话开始之前出现的一些未加密数据(类似于IMAP中的STARTTLS命令),那么您的想法将毫无问题地工作。只需阅读您需要的内容,直到SSL交换应该启动的位置,然后使用SCM_权限将套接字传递给后端进程(例如,请参阅或中的示例)。还有一些库为您做这些工作,即

或者您希望主进程为请求处理程序进程执行SSL加密/解密吗?
在这种情况下,将原始套接字传递给请求处理程序进程是没有意义的,因为它们从中得到的唯一东西是加密数据。在这种情况下,您必须打开到后端进程的新连接,因为它将携带不同的数据(已解密)。然后,主进程将从网络套接字读取加密数据,对其进行解密,并将结果写入请求处理程序的新套接字。类似地,在另一个方向

注意:如果您只是想让您的请求处理过程根本不用担心SSL,我建议让它们在环回接口上侦听,并使用类似SSL/TLS的脏工作


简言之,你必须从上面选择一个。不可能同时做这两件事。

谢谢您的明确解释。我的初衷是,正如您所提到的,我希望对父进程和请求处理程序进程进行加密/解密。当您考虑某些HTTP服务器CGI实现时,您可能会涉及到这种意图。典型的实现是服务器进程将处理HTTP头处理,其余的将在CGI进程中处理。我希望实现这种方法,而不会在服务器进程和CGI(子)进程之间产生过多的数据传输。再次感谢你的澄清。啊,终于完全理解了你的意图。虽然原则上没有什么可以做到这一点(只是传输完整的SSL状态、缓冲区和套接字fd),但我不知道用OpenSSL实现这一点的任何方法,我还没有听说有人尝试过类似的方法。我猜与实际加密的成本相比,一些额外的进程间数据交换是可以忽略不计的。此外,不必处理加密可能会使后端更简单、更干净。