调用 fork 后 gRPC 服务器中的 SSL 握手失败
Posted
技术标签:
【中文标题】调用 fork 后 gRPC 服务器中的 SSL 握手失败【英文标题】:SSL handshake fails in gRPC server after calling fork 【发布时间】: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 服务器如何处理密钥和证书一无所知。
【问题讨论】:
【参考方案1】:正在关闭连接对应的文件描述,导致 SSL 握手失败。 FD首先被关闭的原因可能是因为在fork之后,父子节点共享内核中的文件描述符结构。因此,除非非常小心地同步访问,否则您将遇到数据竞争。
如果可能,请尽早尝试分叉。否则,这一切都取决于父母和孩子在分叉后做什么。
【讨论】:
早期的分叉工作正常。这允许父母在孩子开始监听端口之前退出。客户端可能会尝试与尚未准备好的服务器建立连接。我试图避免这种情况。但是,可以通过使用管道让父等待子指示它何时准备好来克服这个问题。 听起来不错。总是需要同步父母和孩子,管道是一种方式。以上是关于调用 fork 后 gRPC 服务器中的 SSL 握手失败的主要内容,如果未能解决你的问题,请参考以下文章
使用 Zulu jdk 11 从 Alpine Linux Image 调用 GRPC 服务时出现 SSL 连接问题
[使用Zulu jdk 11从Alpine Linux Image调用GRPC服务时出现SSL连接问题
grpc/go 如何在 grpc.Dial 中设置 grpc.ssl_target_name_override