调用 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 启用服务器端 SSL?

grpc/go 如何在 grpc.Dial 中设置 grpc.ssl_target_name_override

grpc++ 中的 SSL 握手错误 (CERTIFICATE_VERIFY_FAILED)

GRPC Java客户端和NodeJS服务器之间的ssl握手问题