【问题标题】:SSL handshake fails in gRPC server after calling fork调用 fork 后 gRPC 服务器中的 SSL 握手失败
【发布时间】:2017-03-17 21:35:36
【问题描述】:

我试图通过分叉一个子进程并使父进程退出来使 c++ gRPC 服务器成为一个守护进程。但在那之后,客户端握手开始失败。

E0307 01:15:58.221786152 27094 handshake.c:128] Security handshake failed: 
{"created":"@1488878158.221756436","description":"Handshake read failed",
"file":"src/core/lib/security/transport/handshake.c",
"file_line":237,"referenced_errors":
[{"created":"@1488878158.221740996","description":"FD shutdown",
"file":"src/core/lib/iomgr/ev_epoll_linux.c","file_line":948}]}

在调用BuildAndStart() 之后调用fork() 时会发生这种情况。如果在BuildAndStart() 之前完成相同的分叉,一切正常。 我对底层 SSL 实现以及 gRPC 服务器如何处理密钥和证书一无所知。

【问题讨论】:

    标签: c++ linux ssl fork grpc


    【解决方案1】:

    正在关闭连接对应的文件描述,导致 SSL 握手失败。 FD首先被关闭的原因可能是因为在fork之后,父子节点共享内核中的文件描述符结构。因此,除非非常小心地同步访问,否则您将遇到数据竞争。

    如果可能,请尽早尝试分叉。否则,这一切都取决于父母和孩子在分叉后做什么。

    【讨论】:

    • 早期的分叉工作正常。这允许父母在孩子开始监听端口之前退出。客户端可能会尝试与尚未准备好的服务器建立连接。我试图避免这种情况。但是,可以通过使用管道让父等待子指示它何时准备好来克服这个问题。
    • 听起来不错。总是需要同步父母和孩子,管道是一种方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 2019-05-18
    • 2017-01-27
    • 2017-10-09
    • 2016-09-23
    • 2020-09-02
    • 1970-01-01
    相关资源
    最近更新 更多