假设我有一个客户端 - 服务器架构。客户端通过安全的SSL TCP连接与服务器通信。客户端和服务器都使用 [HttpPost]
public string checkLogin([FromBody] Login login)
{
getLogin log = new getLogin();
Boolean check = log.checkLogin(login);
if(check == true)
{
return "login done";
}
else
{
return "failed to login";
}
}
和SSL_write
进行通信。
然后,服务器使用SSL_read
并在子分支上运行
fork
基本上,程序的输出将进入套接字,但它是否会被加密,我如何确保进入此套接字的任何内容使用与
close(STDOUT_FILENO)
dup(ssl_socket_from_client)
execvp(...)
相同的写入过程?
提前致谢
答案 0 :(得分:2)
SSL套接字的当前状态在大多数情况下(如使用OpenSSL)保留在用户空间中。分叉时,这种状态会复制到孩子身上。但在执行后,这个重复的状态被抛弃了。这意味着执行的进程只能访问纯内核级文件描述符,但不能访问通过此文件描述符传输加密流量所需的SSL状态。
因此,简单的fork和exec将无法使用SSL套接字。相反,执行过程的父进程需要自己处理所有SSL,即从SSL套接字读取和解密数据,并为执行过程提供明文数据,并从执行过程中读取明文数据,并通过以下方式加密和转发这些数据。 SSL套接字。与执行的过程的通信可以例如通过两个管道或单个套接字对完成。或者作为一些粗略的可视化:
TLS server <--SSL socket--> Parent <--plain socketpair/pipes--> Child
有关相关问题,请参阅Share SSL socket with child process或Python3 CGI HTTPS server fails on Unix。