我在内核5.3版本(Fedora 30和31)上学习了内核TLS,但即使在启用ULP时也卡住了:
// tls.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <linux/tls.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
int main() {
int sock = socket(AF_INET, SOCK_STREAM, 0);
if (sock == -1) {
perror("socket creation");
exit (EXIT_FAILURE);
}
if (setsockopt(sock, SOL_TCP, TCP_ULP, "tls", sizeof("tls")) == -1 ) {
perror("tls init");
exit (EXIT_FAILURE);
}
close (sock);
return EXIT_SUCCESS;
}
然后又道:
$ cat /proc/sys/net/ipv4/tcp_available_ulp
tls
$ gcc tls.c -O0 -g
$ lsmod | grep tls
$ ./a.out
tls init: No such file or directory
$ lsmod | grep tls
$ sudo ./a.out
tls init: Unknown error 524
$ lsmod | grep tls
tls 57344 0
$ ./a.out
tls init: Unknown error 524
$
我不知道我错在哪里。在Kernel TLS文档中看起来很简单:
创建TLS连接
首先创建一个新的TCP套接字并设置TLS ULP。
sock = socket(AF_INET, SOCK_STREAM, 0);
setsockopt(sock, SOL_TCP, TCP_ULP, "tls", sizeof("tls"));
设置TLS ULP允许我们设置/获取TLS套接字选项。目前只有对称加密在内核中处理。在TLS握手完成之后,我们拥有了将数据路径移动到内核所需的所有参数。有一个单独的套接字选项用于将发送和接收移动到内核中。
我不明白如何在内核中启用TLS以及我做错了什么。
1条答案
按热度按时间eaf3rand1#
解决问题
首先要
试试
sudo rmmod tls && sudo modprobe tls
。它解决了“No such file or directory”问题。
传输端点未连接
然后
setsockopt
中出现了另一个错误:按文档操作时出现“传输端点未连接”我不知道为什么文档中的代码 * 不起作用 *(至少在我的debian 12上)。但是,好吧,如果错误说“未连接”,让我们连接它。
你所需要做的就是创建一个服务器和客户端套接字,并生成
connect()
。你可以很容易地找到他们与谷歌。然后你在客户端/服务器上执行setsockopt TCP_ULP
,它就可以工作了。我自己测试过了