LWN:扩展内核里的TLS支持!

关注了就能看到更多这么棒的文章哦~

Extending in-kernel TLS support

By Jonathan Corbet
April 25, 2022
DeepL assisted translation
https://lwn.net/Articles/892216/

内核在 2017 年 9 月推出的 4.13 版本中就支持了 TLS 协议。但这个支持是不完整的,因为它没有给内核提供一种方法来自己发起 TLS 连接。而是需要用户空间创建一个 socket,并在将 socket 交给内核之前执行 TLS 握手,然后内核可以使用 TLS 来传输数据。Chuck Lever 提出了一组 patch,可能可以改变这种情况了,尽管仍然需要用户空间来做些事情。

众所周知,TLS 是用来在网络上传输加密数据的。别的不用说,至少 HTTPS 链接背后依赖的协议就是 TLS。当前,网络上传输的数据有很大一部分是以这种方式加密的。在建立了连接之后,把数据加密发送到另一端的工作是相对比较简单的,对收到的数据进行解密也是如此。然而,建立连接的过程很复杂,其中还涉及到算法协商以及为一端或两端来提供(provision)和验证(verification)公共密钥。

在内核中支持 TLS 的话会有一些好处,包括性能会有小幅提升,并且可以使用 socket filter 来过滤了。不过,TLS session 的建立过程并不太关注性能,而且由于这个过程很复杂,可能会导致更多的 bug 以及安全问题。因此,当人们给内核添加 TLS 支持时,主要专注在数据传输方面,而将建立 session 的困难留给了用户空间。这就是内核的 TLS 支持在过去几年中的工作方式。

这个解决方案是有效的,但有时如果内核能够自己启动 TLS session 的话会很有好处。因此引出了 Lever 的 patch。这个 patch set 仍然没有将 TLS 握手引入内核,尽管最终还是希望能实现这个理想目标的:

从长远来看,我们倾向于在内核中实现 TLS 握手。然而,这还需要很长的时间,而且有些人希望在没有充分理由的情况下就不要去增加 Linux 内核的 "攻击面" 了。因此我们也同时创建了一个原型来实现握手,它会去调用到用户空间,而实际的握手工作就可以由现成的 TLS 库实现来完成。

这个设计要求在有可能需要内核启动 TLS 连接的情况下(具体来说就是所有的 network namespace 里面)运行一个特殊的用户空间进程。该进程将使用新增的 AF_TLSH("TLS helper")address-family type 来创建一个 socket,然后监听该 socket。当内核需要建立一个 TLS session 时,listen() 调用就会返回一个已经连接上的 TCP socket;然后该进程可以与远端的对方来交流从而建立好 session。如果协商成功就可以使用带有新增的 SOL_TLS 选项的 setockopt() 调用来配置新建立的 session。关闭 socket 后就会把它返还给内核。

在内核里面,会有一个新函数在最开始 TCP 连接建立后就被调用:

int tls_client_hello_x509(struct socket *sock, void (*done)(void *data, int status),
        void *data, const char *priorities, key_serial_t peerid,
        key_serial_t cert);

这个调用会试图把 sock 传递给 helper 进程。成功的话就会返回 0;此时仍在进行协商。等到 session 设置成功(或失败)之后,done() 这个回调函数就会被调用,并给出此操作的结果。如果得到的是一个成功的状态,那么内核就应该能够通过 socket 来使用 TLS 进行通信了。还有 tls_client_hello_psk() 函数,它可以在有 pre-shared key 密钥存在的情况下用来共享。

有人会问,为什么需要这个功能?其中之一的用途就是在 TLS 上实现远程过程调用(RPC)协议,这已经有了相关的后续 patch set。这样就可以用来在加密连接之上实现 NFS 文件系统协议了。Lever 说,未来人们可能还有兴趣使用这一功能来在 QUIC 连接之上支持 SMB 文件系统协议,当然,前提是内核在这几年确实支持了 QUIC 的话。

对 TLS patch 的反应相对平静,只有 Hannes Reinecke 的一组 Reviewed-by 标签,他也是其中一个 patch 的作者。相反,RPC-over-TLS patch 则遇到了一些来自 Trond Myklebust 的不同意见,他是内核 NFS 客户端的维护者。他认为这些 setup 工作可以完全在用户空间由 mount.nfs 工具完成。Lever 回应说,在有些情况下,我们认为内核需要决定是否应该使用 TLS。讨论结束时仍然没有得出结论,所以这个话题很可能会在 5 月初的 Linux Storage, Filesystem, and Memory-Management Summit 上继续讨论。

全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~

6644fbd9f83d1902a839a6a81c080ebd.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
因工作需要在Linux环境中用C++编写个发送邮件的程序,着实费了点周折,最终得以满意解决,现将历程与成果与大家分享! 一、刚开始网上一通逛搜,发现Linux环境下,发邮件使用较多的方法是libesmtp包,网上也有示例,按照相关章的指引,很容易就实现的邮件的发送,但问题是不知道如何实现SSL。 二、发现libesmtp文件中有个smtp_starttls_set_ctx接口,似乎是可以解决ssl问题的,逛搜libesmtp解决SSL发送邮件的解决办法,几乎无任何信息,后来下载了个libesmtp的源代码包libesmtp-1.0.6.tar.bz2,内含examples示例目录,可以直接编译成功,但似乎是只支持tls邮件发送,而不支持ssl邮件的发送,百思不得其解。 三、接着寻找别的解决办法,在CSDN搜到一个csmtp说可以解决SSL邮件发送问题的资源,但下载需要50积分,说心话能解决问题50积分也是值得的,但没有呀,提供资源者还比较仁义,告知资来源于https://www.codeproject.com,于是乎在codeproject找到了csmtp的资源,有两个版本,v2.4版本包CSmtp_v2_4_ssl.zip,v1.8版本分为window(CSmtp_v1_8a.zip)和linux(CSmtp_v1_8b.zip)两个包。 四、为了能省点精力,就直接用版较低的linux版吧,解压后发现有makefile文件,可直接编译通过,一般的邮件能发送成功,但可惜的是v1.8版本也不支持ssl协议。 五、其实从包的名字上就能看出来v2.4版本开始支持 ssl协议,但v2.4并不分windows版本和linux版本,是否能支持linux呢,查看源代码发现有对linux支持,只是包内没有makefile文件,似乎没有在linux目录下编译过,于是编写了个makefile文件尝试编译,竞然编通过,而且发送文件成功,经过测试可以支持ssl邮件的发送,因暂无需求tls未做测试。 六、现将程序重新打包成csmtp_v2.4_linux.tar文件,与大家分享,文中所提到的相关资源包都一并打包到资源中了。 最后感谢原创christopher w. backen提供的代码资源!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值