c - 如何在一个进程中进行 TLS 握手并在另一个进程中处理其余连接?

标签 c linux sockets ssl openssl

我一直在尝试实现 TLS 服务器。 由于某些要求,我需要在一个进程上接受 TLS 握手,并在另一个进程(这些进程在不同设备上运行)上执行对称加密操作(以及 TLS 连接的其余部分)。 目前,我正在考虑 2 种可能的解决方案:

  1. 从 SSL 上下文中获取 key 、iv 和其他一些信息 - 通过 它们与套接字 fd 一起进入第二个进程 - 执行 enc/dec 并通过套接字连接发送/接收。普通加密/ 解密部分不是大问题,但其他东西(错误 检查、警报、重新谈判...)将是一场噩梦。
  2. 以某种方式将整个 SSL 上下文(SSL 结构)传递给第二个 处理并重用它。几年前我发现了几个关于这个的问题 方法,但都没有一个好的答案。

那么有什么方法可以使用 OpenSSL 执行第二种方法(有人建议使用 TLSe 项目,但我只想坚持使用原始的 OpenSSL)? 如果有人解决了这个问题,是否有更好的解决方案?

任何帮助将不胜感激。谢谢!

最佳答案

您可以在一个进程中执行 TLS 握手,然后 fork 一个新进程,TLS 握手中涉及的已接受套接字将与子进程共享,使用您可以在子进程中执行 send()/recv() 部分

如果这两个进程不相关,恐怕您无法在一个进程/设备上进行 TLS 握手并通过不同的套接字在另一个进程/设备上重用它

TLS 用于在两个端点之间创建安全隧道,两个端点相互验证(服务器验证客户端是可选的),您尝试的是不可能的,每个新连接都必须进行新的握手

SSL session 可以重复用于已经在它们之间进行握手的端点,当你想连接到全新的实体时它不适用于这里

关于c - 如何在一个进程中进行 TLS 握手并在另一个进程中处理其余连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47526767/

相关文章:

c - 如何计算C中任意给定值的百分比?

linux - base64 包不可用。有没有替代品,以便我仍然可以使用该命令?

c# - C#UDPClient未通过外部IP接收数据包

linux - 如何使用 bash 脚本将一行中的一些重复模式分成多行?

python - 套接字无法建立连接

c - Telnet "wont echo"被windows机器抑制

c - GetModuleFileNameW 在当前模块上返回 Null

c++ - 如何在字符串末尾添加空字符?

c - 如何声明一个不透明的结构指针接口(interface)

linux - BlueZ:移除与 BLE 设备的绑定(bind)不起作用