步骤 1:验证标头

步骤 1:验证标头

我正在尝试从主分支构建 Openssl-3.0.0 以在 Ubuntu 16 上使用 ktls 功能,但构建跳过了 ktls 功能

尽管我使用的是 Ubuntu 16.04.1(内核版本:4.15),但不知何故,此版本选取了主机中不存在的旧版本内核头文件,并跳过了 KTLS 功能,

我这里遗漏了什么吗?有人能帮我构建这个组件吗?

步骤如下

步骤 1:验证标头

kafka-secure2:/usr/src$ uname -a
Linux kafka-secure2 4.15.0-50-generic #54~16.04.1-Ubuntu SMP Wed May 8 15:55:19 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux

kafka-secure2:/usr/src$ find . -name version.h
./linux-headers-4.15.0-52/include/xen/interface/version.h
./linux-headers-4.15.0-52/include/uapi/linux/dvb/version.h
./linux-headers-4.15.0-50-generic/include/config/arch/want/compat/ipc/parse/version.h
./linux-headers-4.15.0-50-generic/include/generated/uapi/linux/version.h
./linux-headers-4.15.0-50/include/linux/version.h
./linux-headers-4.15.0-50/include/xen/interface/version.h
./linux-headers-4.15.0-50/include/uapi/linux/dvb/version.h
./linux-headers-4.15.0-52-generic/include/config/arch/want/compat/ipc/parse/version.h
./linux-headers-4.15.0-52-generic/include/generated/uapi/linux/version.h

步骤2:启动 Openssl 构建

kafka-secure2:~/sanat/openssl-build$ $HOME/sanat/openssl-master/config enable-ktls --prefix=/home/kafka/openssl/openssl --openssldir=/home/kafka/openssl/ssl
Operating system: x86_64-whatever-linux2
Configuring OpenSSL version 3.0.0-dev for target linux-x86_64
Using os-specific seed configuration
cat: /usr/include/linux/version.h: No such file or directory   <====================Still looking for this version.h


Creating configdata.pm
Creating Makefile

**********************************************************************
***                                                                ***
***   OpenSSL has been successfully configured                     ***
***                                                                ***
***   If you encounter a problem while building, please open an    ***
***   issue on GitHub <https://github.com/openssl/openssl/issues>  ***
***   and include the output from the following command:           ***
***                                                                ***
***       perl configdata.pm --dump                                ***
***                                                                ***
***   (If you are new to OpenSSL, you might want to consult the    ***
***   'Troubleshooting' section in the INSTALL file first)         ***
***                                                                ***
**********************************************************************
kafka-secure2:~/sanat/openssl-build$ ./configdata.pm -o

Enabled features:

......

Disabled features:

    ktls                    [too-old-kernel] 
    asan                    [default]        OPENSSL_NO_ASAN
    buildtest-c++           [default]        

步骤3:因此我手动将 version.h 从 uapi 复制到 linux 文件夹,其中包含最新版本

linux-headers-4.15.0-50/         linux-headers-4.15.0-50-generic/ linux-headers-4.15.0-52/         linux-headers-4.15.0-52-generic/ 
kafka-secure2:~/kafka/kafka_2.12-1.1.1$ cat /usr/src/linux-headers-4.15.0-50-generic/include/generated/uapi/linux/version.h
#define LINUX_VERSION_CODE 266002
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))


kafka-secure2:/usr/src$ cp  ./linux-headers-4.15.0-50-generic/include/generated/uapi/linux/version.h /usr/include/linux/

步骤4:这次在配置中启用了ktls

kafka-secure2:~/sanat/openssl-build$ $HOME/sanat/openssl-master/config enable-ktls --prefix=/home/kafka/openssl/openssl --openssldir=/home/kafka/openssl/ssl
Operating system: x86_64-whatever-linux2
Configuring OpenSSL version 3.0.0-dev for target linux-x86_64
Using os-specific seed configuration
Creating configdata.pm
Creating Makefile

**********************************************************************
***                                                                ***
***   OpenSSL has been successfully configured                     ***
***                                                                ***
***   If you encounter a problem while building, please open an    ***
***   issue on GitHub <https://github.com/openssl/openssl/issues>  ***
***   and include the output from the following command:           ***
***                                                                ***
***       perl configdata.pm --dump                                ***
***                                                                ***
***   (If you are new to OpenSSL, you might want to consult the    ***
***   'Troubleshooting' section in the INSTALL file first)         ***
***                                                                ***
**********************************************************************

kafka-secure2:~/sanat/openssl-build$ ./configdata.pm -o

Enabled features:

    ktls
    afalgeng
    ...

步骤5:但构建跳过了KTLS功能

kafka-secure2:~/sanat/openssl-build$ make

ssl-master/providers/common/ciphers -I../openssl-master/crypto  -DAES_ASM -DBSAES_ASM -DECP_NISTZ256_ASM -DGHASH_ASM -DKECCAK1600_ASM -DMD5_ASM -DOPENSSL_BN_ASM_GF2m -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_CPUID_OBJ -DPOLY1305_ASM -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DVPAES_ASM -DWHIRLPOOL_ASM -DX25519_ASM -fPIC -pthread -m64 -Wall -O3 -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSLDIR="\"/home/kafka/openssl/ssl\"" -DENGINESDIR="\"/home/kafka/openssl/openssl/lib/engines-3\"" -DMODULESDIR="\"/home/kafka/openssl/openssl/lib/ossl-modules\"" -DNDEBUG   -c -o crypto/bio/libcrypto-lib-bss_sock.o ../openssl-master/crypto/bio/bss_sock.c
In file included from ../openssl-master/crypto/bio/bss_sock.c:14:0:
../openssl-master/include/internal/ktls.h:23:7: warning: #warning "KTLS requires Kernel Headers >= 4.13.0" [-Wcpp]
 #     warning "KTLS requires Kernel Headers >= 4.13.0"
       ^
../openssl-master/include/internal/ktls.h:24:7: warning: #warning "Skipping Compilation of KTLS" [-Wcpp]
 #     warning "Skipping Compilation of KTLS"
       ^

答案1

我尝试使用 Linux 内核 4.20 重现上述问题。我执行了以下步骤:

  1. 下载 Linux 内核 4.20 并启用内核 TLS(CONFIG_TLS=y 和 CONFIG_TLS_DEVICE=y)
  2. 编译并安装linux内核4.20
  3. 克隆最新的 Openssl 主代码库(截至 2019 年 9 月 14 日)并执行以下步骤

    • ./config'-WL,--enable-new-dtags,-rpath,$(LIBRPATH)'启用-ktls
    • 制作
    • 进行测试
    • 安装

我没有看到如上所述的任何警告消息或编译或使测试失败的问题。

我已经查看了 OpenSSL 主分支和 Linux 内核中与 KTLS 相关的提交(截至 2019 年 9 月 14 日)。

发现 Linux 内核版本 4.20 之后存在与 KTLS 相关的中断。

我能够使用 Linux 内核版本 4.20 进行编译并通过测试。

笔记:

  1. KTLS 功能在 4.13 之后合并到主线 Linux 内核,并在 4.17 之后添加了 TLS_RX。
  2. 由于 Linux 内核端 KTLS 中断,在 Linux 内核版本 5.0 和 5.2.11 中进行测试(使用 OpenSSL 主分支代码)失败。

答案2

问题出在您安装的 Linux 内核头文件版本上。头文件版本应大于 4.17。版本取自: /usr/include/linux/version.h

在我的机器上它是:

#define LINUX_VERSION_CODE 329216
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))

代表 Linux 5.6.0

您可以按照此处所述从源代码安装新的内核头文件: https://www.kernel.org/doc/Documentation/kbuild/headers_install.txt

或者你可以按照此处所述从你的发行版安装标题: https://www.tecmint.com/install-kernel-headers-in-ubuntu-and-debian/

相关内容