ssl 内核TLS选项启用时setsockopt失败

bvhaajcl  于 8个月前  发布在  其他
关注(0)|答案(1)|浏览(109)

我在内核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以及我做错了什么。

eaf3rand

eaf3rand1#

解决问题

首先要

sudo modprobe tls

试试sudo rmmod tls && sudo modprobe tls
它解决了“No such file or directory”问题。

传输端点未连接

然后setsockopt中出现了另一个错误:按文档操作时出现“传输端点未连接

sock = socket(AF_INET, SOCK_STREAM, 0);
setsockopt(sock, SOL_TCP, TCP_ULP, "tls", sizeof("tls"));

我不知道为什么文档中的代码 * 不起作用 *(至少在我的debian 12上)。但是,好吧,如果错误说“未连接”,让我们连接它。
你所需要做的就是创建一个服务器和客户端套接字,并生成connect()。你可以很容易地找到他们与谷歌。然后你在客户端/服务器上执行setsockopt TCP_ULP,它就可以工作了。我自己测试过了

相关问题