解码ARM 开发板 OpenSSL+cURL 交叉编译与 HTTPS 配置

前期准备

确认交叉编译工具链

确保 ARM 交叉编译工具链已安装并配置生效(以 arm-none-linux-gnueabi-gccarm-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
相关推荐
亲爱的非洲野猪1 小时前
为Tomcat部署SSL证书:从零到一的HTTPS配置指南
https·tomcat·ssl
2501_915106322 小时前
iPhone 耗电异常全面诊断指南,构建多工具协同的电量分析与优化体系
android·ios·小程序·https·uni-app·iphone·webview
feathered-feathered2 小时前
网络原理——应用层协议HTTP/HTTPS(重点较为突出)
java·网络·后端·网络协议·http·https
“αβ”10 小时前
MySQL表的操作
linux·网络·数据库·c++·网络协议·mysql·https
oxygen-120418 小时前
https nginx步骤
网络协议·http·https
吃西瓜的星星19 小时前
从0开始完成ActiveMQ-cpp在windows_x86平台的编译(从编译openssl开始)
activemq·openssl·c/c++
大大大水蜜桃19 小时前
Nginx HTTPS服务搭建实验
运维·nginx·https
繁华似锦respect1 天前
HTTPS 中 TLS 协议详细过程 + 数字证书/签名深度解析
开发语言·c++·网络协议·http·单例模式·设计模式·https
张人玉1 天前
C#Https协议相关知识点
开发语言·https·c#