我正在尝试从主分支构建 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 重现上述问题。我执行了以下步骤:
- 下载 Linux 内核 4.20 并启用内核 TLS(CONFIG_TLS=y 和 CONFIG_TLS_DEVICE=y)
- 编译并安装linux内核4.20
克隆最新的 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 进行编译并通过测试。
笔记:
- KTLS 功能在 4.13 之后合并到主线 Linux 内核,并在 4.17 之后添加了 TLS_RX。
- 由于 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/