【问题标题】:How to programmatically redirect a program's output to a SSL socket如何以编程方式将程序的输出重定向到 SSL 套接字
【发布时间】:2018-06-11 11:08:27
【问题描述】:

假设我有一个客户端-服务器架构。客户端通过安全的 SSL TCP 连接与服务器通信。客户端和服务器都使用SSL_writeSSL_read 进行通信。

然后,服务器使用fork 并在子分支上运行 close(STDOUT_FILENO) dup(ssl_socket_from_client) execvp(...)

基本上,程序的输出将进入套接字,但它会被加密吗?我如何确保进入这个套接字的任何内容都使用与SSL_write相同的写入过程?

提前致谢

【问题讨论】:

    标签: linux sockets ssl redirect openssl


    【解决方案1】:

    SSL 套接字的当前状态在大多数情况下(如 OpenSSL)保存在用户空间中。当分叉时,这个状态被复制到孩子中。但是在 exec 之后,这个重复的状态被丢弃了。这意味着执行的进程只能访问普通内核级文件描述符,但不能访问通过该文件描述符传输加密流量所需的 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

    【讨论】:

    • 好的,所以应该在父子节点之间创建另一个套接字。子进程会将其输出转储到新创建的套接字中,然后父进程将使用SSL_write 进行响应。现在更有意义了,谢谢
    • 另一个问题:如何实现stdin重定向?如果服务器运行的命令需要来自客户端的输入怎么办?使用新级别的套接字,我不知道何时读取以及何时写入管道。在这种情况下阻止 SSL_read 和 SSL_write 是否可行?
    • @DenisRozimovschii:这是一个有点相关但仍然是新问题,因此不应在评论中提出。我建议查看pipesocketpair 以创建必要的文件描述符,使用dupdup2 将stdin/stdout 映射到孩子中的这些fd 并使用selectpollkqueue 或您的操作系统提供的任何内容,以了解何时可以从一个 fd(ssl 或纯文本)读取数据并转发到另一个 fd(纯文本或 ssl)。如果您对事件驱动编程不太熟悉,您也可以使用线程。
    • 我已经实现了socketpair相关的东西,但我不知道描述符上的轮询和事件。现在,当我这样做时,我会进步。谢谢你。另外,我觉得这个问题和 cmets 里面有太多的上下文,所以开始一个新的将是浪费
    • 我根据您的建议创建了一个单独的问题stackoverflow.com/questions/48084446/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多