如何以编程方式将程序的输出重定向到SSL套接字

时间:2018-01-01 11:16:58

标签: linux sockets ssl redirect openssl

假设我有一个客户端 - 服务器架构。客户端通过安全的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(...) 相同的写入过程?

提前致谢

1 个答案:

答案 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 processPython3 CGI HTTPS server fails on Unix