ARM Yocto环境下awscrt模块报EVP_aead_aes_128_gcm_tls13未定义符号错误
解决ARM网关中awsiotsdk导入时的EVP_aead_aes_128_gcm_tls13未定义符号错误
问题背景
在自定义ARM网关部署Greengrass V2组件时,组件依赖的Python awsiotsdk 导入失败,报错如下:
ImportError: /usr/lib/python3.7/site-packages/_awscrt.cpython-37m-arm-linux-gnueabi.so: undefined symbol: EVP_aead_aes_128_gcm_tls13
相同版本的awsiotsdk在x86环境中可正常运行。对比ARM网关与x86环境下的_awscrt.so文件符号,发现ARM版本仅包含EVP_aead_aes_128_gcm_tls13符号的引用,而x86版本包含该符号的完整实现相关条目。此外,ARM网关的OpenSSL版本为1.1.1g(官方支持TLS1.3)。
问题分析
虽然OpenSSL 1.1.1g原生支持TLS1.3,但出现该错误通常是以下原因:
- 本地编译
awscrt时,未正确链接到包含目标符号的OpenSSL库 - ARM网关的OpenSSL为定制编译版本,未启用TLS1.3相关的AES-GCM AEAD算法模块
- 编译
awscrt时使用的OpenSSL头文件与运行时加载的库版本不匹配
解决方案
1. 重新编译awsiotsdk并指定正确的OpenSSL路径
先卸载现有依赖:
pip uninstall -y awsiotsdk awscrt
然后编译安装时明确指定OpenSSL的库和头文件路径(以OpenSSL安装在/usr/local/ssl为例):
pip install awsiotsdk --global-option=build_ext --global-option="-L/usr/local/ssl/lib" --global-option="-I/usr/local/ssl/include"
安装前可先验证OpenSSL是否支持TLS1.3的AES-GCM套件:
openssl ciphers -v | grep TLSv1.3
输出中需包含AES-128-GCM-SHA256等TLS1.3相关的加密套件。
2. 检查系统OpenSSL库是否包含目标符号
使用nm命令检查系统的OpenSSL库:
nm -D /usr/lib/libssl.so.1.1 | grep EVP_aead_aes_128_gcm_tls13
如果无输出,说明系统OpenSSL编译时未包含该符号,需重新编译OpenSSL:
# 下载源码 wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz tar xzf openssl-1.1.1g.tar.gz cd openssl-1.1.1g # 配置编译参数(适配ARM架构,启用TLS1.3和AES-GCM) ./Configure linux-armv4 --prefix=/usr/local/ssl enable-tls1_3 enable-aes enable-gcm # 编译安装 make && make install
完成后再重新执行步骤1的awsiotsdk安装命令。
3. 尝试使用预编译的awscrt Wheel包
避免本地编译的兼容性问题,尝试安装预编译版本:
pip install awscrt --only-binary :all:
注意:部分小众ARM架构可能没有预编译包,此时需回到编译方案。
4. 降级awsiotsdk版本
新版本awsiotsdk依赖的awscrt可能使用了较新的OpenSSL符号,可尝试降级到适配ARM环境的旧版本(示例版本需自行测试验证):
pip install awsiotsdk==1.14.0
内容的提问来源于stack exchange,提问作者Kiran G
相关产品推荐
相关产品推荐

