前期准备
确认交叉编译工具链
确保 ARM 交叉编译工具链已安装并配置生效(以 arm-none-linux-gnueabi-gcc 或 arm-linux-gcc 为例):
bash
# 检查工具链是否可用
arm-linux-gcc -v # 或 arm-none-linux-gnueabi-gcc -v
若提示 "command not found",需先安装工具链(如从厂商获取或通过包管理器安装)。
创建安装目录
bash
mkdir -p ~/openssl-arm ~/curl-arm # -p 确保父目录不存在时自动创建
交叉编译 OpenSSL(以 1.1.1为例)
下载并解压源码
bash
# 下载源码(官网或镜像站)
curl -O https://github.com/openssl/openssl/releases/download/OpenSSL_1_1_1w/openssl-1.1.1w.tar.gz
# 解压
tar -xzf openssl-1.1.1w.tar.gz
cd openssl-1.1.1w
浏览器手动下载
如果命令行下载持续失败,可直接通过浏览器访问以下地址下载,再传输到服务器:https://github.com/openssl/openssl/releases/download/OpenSSL_1_1_1w/openssl-1.1.1w.tar.gz
配置交叉编译环境变量
bash
# 工具链路径(根据实际安装路径调整)
export TOOLCHAIN_PATH=/home/wby/arm-linux-gcc/usr/local/arm/5.4.0/usr/bin
export SYSROOT_PATH=/home/wby/arm-linux-gcc/usr/local/arm/5.4.0/usr/arm-none-linux-gnueabi/sysroot
# 配置环境变量
export PATH=$TOOLCHAIN_PATH:$PATH
export CC=arm-linux-gcc # 或 arm-none-linux-gnueabi-gcc
export AR=arm-linux-ar
export RANLIB=arm-linux-ranlib
export CFLAGS="--sysroot=$SYSROOT_PATH -march=armv7-a -O2" # -O2 优化编译
export LDFLAGS="--sysroot=$SYSROOT_PATH"
配置 OpenSSL 编译参数
OpenSSL 需通过 Configure 脚本配置,关键参数需补充交叉编译前缀(否则可能调用主机编译器):
bash
./Configure \
linux-armv4 \ # 兼容 ARMv4/ARMv5/ARMv7,ARMv7 也可指定 linux-armv7
--prefix=$HOME/openssl-arm/openssl \
--openssldir=$HOME/openssl-arm/ssl \
#--cross-compile-prefix=arm-linux- \ # 要么用 --cross-compile-prefix 指定前缀,要么直接设置 CC,二选一,不可同时用!
shared \ # 生成动态库
no-asm \ # 禁用汇编优化(避免不同 ARM 架构兼容性问题)
no-async \
-DOPENSSL_USE_IPV6=1 \
-march=armv7-a \
--sysroot=$SYSROOT_PATH
bash
./Configure \
linux-armv4 \
--prefix=$HOME/openssl-arm/openssl \
--openssldir=$HOME/openssl-arm/ssl \
shared \
no-asm \
no-async \
-DOPENSSL_USE_IPV6=1 \
-march=armv7-a \
--sysroot=$SYSROOT_PATH
参数说明:
linux-armv4:OpenSSL 定义的目标平台,兼容 ARMv7;若工具链明确为 ARMv7,可替换为linux-armv7。-cross-compile-prefix:指定交叉工具链前缀(如arm-none-linux-gnueabi-),必须与实际工具链匹配。-prefix:编译产物安装目录,后续 curl 需依赖此路径。
编译与安装
bash
make -j$(nproc) # -j 启用多核编译,$(nproc) 自动获取 CPU 核心数
make install
验证编译结果
检查产物是否为 ARM 架构:
bash
file ~/openssl-arm/openssl/bin/openssl
预期输出:
/home/xxx/openssl-arm/bin/openssl: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=xxx, not stripped
交叉编译 cURL(以 8.7.1 为例)
下载并解压源码
bash
cd ~/curl-arm
wget https://curl.se/download/curl-8.7.1.tar.gz --no-check-certificate
tar -xzf curl-8.7.1.tar.gz
cd curl-8.7.1
配置依赖环境(关联 OpenSSL)
bash
export OPENSSL_ROOT=$HOME/openssl-arm/openssl
export CC=arm-linux-gcc
export CFLAGS="-march=armv4t" # 先用工具链支持的基础架构
export LDFLAGS="-L$OPENSSL_ROOT/lib"
export CPPFLAGS="-I$OPENSSL_ROOT/include"
配置 cURL 编译参数
bash
./configure \
--host=arm-linux \ # 目标平台(与工具链前缀匹配,如 arm-none-linux-gnueabi)
--prefix=$HOME/curl-arm/curl \
--with-ssl=$OPENSSL_ROOT \ # 关联交叉编译的 OpenSSL
--enable-https \ # 启用 HTTPS 支持
--enable-shared \ # 生成动态库
--disable-static \ # 禁用静态库
bash
./configure \
--host=arm-linux \
--prefix=$HOME/curl-arm/curl \
--with-ssl=$OPENSSL_ROOT \
--enable-https \
--enable-shared \
--disable-static
检查配置结果:配置完成后查看输出,确认 SSL 已启用:
SSL: enabled (OpenSSL)
编译与安装
bash
make -j$(nproc)
make install
验证编译结果
bash
file ~/curl-arm/curl/bin/curl
预期输出:
/home/xxx/curl-arm/bin/curl: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=xxx, not stripped
部署到 ARM 开发板
传输文件到开发板
使用 scp 或 U 盘将编译产物传输到开发板(假设开发板 IP 为 192.168.1.100):
bash
# 传输 OpenSSL
scp -r ~/openssl-arm/openssl root@192.168.1.100:/usr/local/openssl
# 传输 cURL
scp -r ~/curl-arm/curl root@192.168.1.100:/usr/local/curl
配置开发板环境变量
编辑开发板的环境变量配置文件(如 /etc/profile 或 ~/.bashrc):
vi /etc/profile
添加以下内容:
bash
# OpenSSL 环境变量
export PATH=/usr/local/openssl/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/openssl/lib:$LD_LIBRARY_PATH
# cURL 环境变量
export PATH=/usr/local/curl/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/curl/lib:$LD_LIBRARY_PATH
生效配置:
bash
source /etc/profile
库文件软链接(可选,解决库依赖)
若开发板提示 "找不到 libcurl.so.4" 或 "找不到 libssl.so.1.1",创建软链接:
bash
# OpenSSL 库链接
ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/lib/libssl.so.1.1
ln -s /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib/libcrypto.so.1.1
# cURL 库链接
ln -s /usr/local/curl/lib/libcurl.so.4.8.0 /usr/lib/libcurl.so.4
ln -s /usr/local/curl/lib/libcurl.so.4 /usr/lib/libcurl.so
替代 cp 命令,软链接更便于后续版本更新。
权限设置
bash
chmod +x /usr/local/openssl/bin/openssl
chmod +x /usr/local/curl/bin/curl
功能验证
版本检查
bash
# 检查 OpenSSL 版本
openssl version
# 预期输出:OpenSSL 1.1.1w 11 Sep 2023
# 检查 cURL 版本(确认关联 OpenSSL)
curl -V
# 预期输出:
curl 8.7.1 (arm-unknown-linux-gnu) libcurl/8.7.1 OpenSSL/1.1.1w zlib/1.2.12
Release-Date: 2024-03-27
Protocols: dict file ftp ftps gopher gophers http https imap imaps ipfs ipns mqtt pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS HSTS HTTPS-proxy IPv6 Largefile libz NTLM SSL threadsafe TLS-SRP UnixSockets
HTTPS 连接测试
步骤 1:部署 CA 证书(解决证书验证问题)
从宿主机复制 CA 证书到开发板:
bash
# 宿主机执行
scp /etc/ssl/certs/ca-certificates.crt root@192.168.1.100:/etc/ssl/certs/
开发板配置证书路径:
bash
export SSL_CERT_FILE=/etc/ssl/certs/ca-certificates.crt
步骤 2:校准开发板时间(关键!证书依赖时间)
bash
# 手动设置时间(格式:YYYY-MM-DD HH:MM:SS)
date -s "2025-12-03 15:00:00"
# 若开发板支持 NTP,可自动同步(推荐)
ntpdate pool.ntp.org
步骤 3:测试 HTTPS 连接
bash
curl https://www.baidu.com
预期输出:百度首页 HTML 内容。
常见问题排查
问题 1:编译时提示 "arm-linux-gcc: command not found"
- 检查
TOOLCHAIN_PATH是否正确,或工具链未安装。 - 确认
export PATH已将工具链路径加入。
问题 2:curl 配置时提示 "SSL disabled; you must install an SSL toolkit"
- 检查
OPENSSL_ROOT路径是否正确,或 OpenSSL 编译失败。 - 确保
pkg-config能检测到 OpenSSL(执行pkg-config --cflags --libs openssl验证)。
问题 3:开发板运行 curl 提示 "error while loading shared libraries"
- 检查
LD_LIBRARY_PATH是否包含库路径,或未创建软链接。 - 使用
ldd /usr/local/curl/bin/curl查看缺失的库。
问题 4:HTTPS 连接提示 "certificate is not yet valid"
- 开发板系统时间与证书有效期不匹配,校准时间即可。
注意事项
- 工具链版本需与开发板内核 / 根文件系统匹配(如 ARMv7 工具链对应 ARMv7 开发板)。
- OpenSSL 1.1.1 系列为 LTS 版本,推荐使用;若需 3.x 版本,需调整 Configure 参数(如
linux-armv7)。 - 编译时若需静态库,可将
shared改为static(OpenSSL)或-enable-static --disable-shared(curl)。 - 开发板若无网络,可通过 U 盘传输文件,替代
scp。