鸿蒙 PC 实战:openHiTLS 源码编译、安装、签名与运行
原创
利刃信安
利刃信安
利刃信安
2026年10月19日 00:30
北京
去阅读
鸿蒙 PC 实战:openHiTLS 源码编译、安装、签名与运行
- 环境:HarmonyOS PC(aarch64)
- 源码:gitcode.com/openHiTLS/openhitls,main 分支
- 版本:openHiTLS 0.4.0
- 工具链:鸿蒙自带 Clang 15 + CMake 3.28 + Ninja
openHiTLS 是面向 TLS、密码学、PKI 和认证场景的开源安全协议库。本文记录在鸿蒙 PC 上从源码完成编译、安装、签名并运行 CLI 的完整过程,全程使用鸿蒙命令行工具包自带的原生工具链,不需要额外安装 Harmonybrew。
一、最终效果
编译安装完成后,可以直接运行 openHiTLS 命令行工具:
`$ ./install/bin/hitls version
openHiTLS 0.4.0 31 Mar. 2026
$ ./install/bin/hitls rand -hex 16
acd5315919e4455d4fbce8cc3ff11587`
同时会得到静态库、共享库和完整的公共头文件,可直接用于鸿蒙原生 C/C++ 项目。
二、环境与工具链
鸿蒙命令行工具包中已经包含完整的原生工具链:
| 项目 | 路径或版本 |
|---|---|
| 原生 SDK 根目录 | /data/service/hnp/hmos-clt.org/hmos-clt_1.0.0/sdk/default/openharmony/native |
| C 编译器 | Clang 15.0.4,llvm/bin/clang |
| 构建工具 | CMake 3.28.2 + Ninja 1.13.2,build-tools/cmake/bin/ |
| 系统头文件与库 | sysroot/ |
| 交叉工具链文件 | build/cmake/ohos.toolchain.cmake |
| ELF 签名工具 | $SDK_NATIVE/../toolchains/lib/binary-sign-tool |
先设置一个环境变量,后面的命令都基于它:
export SDK_NATIVE=/data/service/hnp/hmos-clt.org/hmos-clt_1.0.0/sdk/default/openharmony/native
如果目录版本不同,可以用下面的命令找到实际路径:
ls /data/service/hnp/*/*/sdk/default/openharmony/native
三、获取源码
mkdir -p ~/Documents/openhitls
cd ~/Documents/openhitls
git clone https://gitcode.com/openHiTLS/openhitls.git src
本文使用的版本为 main 分支 HEAD defab80,构建出的库版本为 openHiTLS 0.4.0。
四、为 CLI 补一个 musl 头文件
openHiTLS 的命令行工具在 musl 环境下需要显式包含 <sys/time.h>,以补全 struct timeval 类型。
打开:
src/apps/src/app_tls_common.c
找到:
#include <sys/socket.h>
在下一行加入:
#include <sys/time.h>
如果只构建库、不构建 CLI,可以跳过这一步。
五、配置构建
创建构建目录并配置 CMake:
`cd ~/Documents/openhitls
\"$SDK_NATIVE/build-tools/cmake/bin/cmake\" \
-S src \
-B build \
-G Ninja \
-DCMAKE_TOOLCHAIN_FILE=\"$SDK_NATIVE/build/cmake/ohos.toolchain.cmake\" \
-DCMAKE_MAKE_PROGRAM=\"$SDK_NATIVE/build-tools/cmake/bin/ninja\" \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=\"$PWD/install\" \
-DCMAKE_INSTALL_RPATH='$ORIGIN/../lib' \
-DHITLS_BSL_SAL_LINUX=ON \
-DHITLS_BUILD_STATIC=ON \
-DHITLS_BUILD_SHARED=ON \
-DHITLS_BUILD_EXE=ON`
几个关键参数:
CMAKE_TOOLCHAIN_FILE
:使用鸿蒙原生的 OHOS 交叉工具链。
* -DHITLS_BSL_SAL_LINUX=ON
:openHiTLS 默认只识别 Linux 和 Darwin,而鸿蒙工具链的系统名是 OHOS,需要显式启用 POSIX 平台层。
* -DCMAKE_INSTALL_RPATH='$ORIGIN/../lib'
:让 bin/hitls 自动找到同级的 lib/ 目录,运行时不需要设置 LD_LIBRARY_PATH。
* HITLS_BUILD_STATIC
、HITLS_BUILD_SHARED、HITLS_BUILD_EXE:同时生成静态库、共享库和命令行工具。
六、编译与安装
\"$SDK_NATIVE/build-tools/cmake/bin/cmake\" --build build -j 4
\"$SDK_NATIVE/build-tools/cmake/bin/cmake\" --install build
全量构建包含约 500 个目标,在 8 核机器上几分钟内可以完成。编译阶段无错误、无警告。
安装完成后得到:
| 路径 | 内容 |
|---|---|
install/bin/hitls |
命令行工具 |
install/lib/libhitls_*.a |
静态库 |
install/lib/libhitls_*.so |
共享库 |
install/include/hitls/ |
公共头文件 |
包含的库为:
libhitls_bsl
libhitls_crypto
libhitls_pki
libhitls_tls
libhitls_auth
七、给 ELF 签名
鸿蒙 PC 在执行 ELF 之前会校验代码签名,未签名的可执行文件和共享库都会被系统拒绝。因此安装完成后必须做一次签名,这一步不能省。
`SIGN_TOOL=\"$SDK_NATIVE/../toolchains/lib/binary-sign-tool\"
OBJCOPY=\"$SDK_NATIVE/llvm/bin/llvm-objcopy\"
for f in install/bin/hitls install/lib/libhitls_*.so; do
\"$OBJCOPY\" --remove-section .codesign \"$f\" 2>/dev/null || true
\"$SIGN_TOOL\" sign -inFile \"$f\" -outFile \"$f.signed\" -selfSign 1
mv \"$f.signed\" \"$f\"
done`
要点:
- 主程序和所有依赖的
.so都要签名,只签hitls不够。 - 静态库
.a不参与 ELF 加载,不需要签名。 - 链接器生成的
.codesign只是占位标记,不是系统认可的有效签名;签名前先删除旧段。 - 自签名适合本机开发和调试;正式分发给其他设备时,应使用官方 HNP 包或 HAP 打包签名流程。
八、运行验证
./install/bin/hitls version
./install/bin/hitls rand -hex 16
输出:
`$ ./install/bin/hitls version
openHiTLS 0.4.0 31 Mar. 2026
$ ./install/bin/hitls rand -hex 16
acd5315919e4455d4fbce8cc3ff11587`
查看支持的命令:
./install/bin/hitls help
function: HiTLS supports the following commands:
help version rand enc
pkcs12 rsa x509 list
dgst crl genrsa verify
pkey genpkey req mac
kdf passwd prime errdecode
s_client s_server pkeyutl asn1parse
到这里,openHiTLS 已经完成编译、安装、签名和运行验证。
九、一键构建脚本
把下面的内容保存为 build.sh,放在 openHiTLS 工程根目录,以后可以直接一键重建:
`#!/bin/sh
set -e
ROOT=$(cd \"$(dirname \"$0\")\" && pwd)
SDK_NATIVE=/data/service/hnp/hmos-clt.org/hmos-clt_1.0.0/sdk/default/openharmony/native
CMAKE=\"$SDK_NATIVE/build-tools/cmake/bin/cmake\"
NINJA=\"$SDK_NATIVE/build-tools/cmake/bin/ninja\"
HITLS_BSL_SAL_LINUX: openHiTLS 只自动识别 Linux/Darwin,而 OHOS 工具链报告的系统名是 OHOS
\"$CMAKE\" -S \"$ROOT/src\" -B \"$ROOT/build\" -G Ninja \
-DCMAKE_TOOLCHAIN_FILE=\"$SDK_NATIVE/build/cmake/ohos.toolchain.cmake\" \
-DCMAKE_MAKE_PROGRAM=\"$NINJA\" \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX=\"$ROOT/install\" \
-DCMAKE_INSTALL_RPATH='$ORIGIN/../lib' \
-DHITLS_BSL_SAL_LINUX=ON \
-DHITLS_BUILD_STATIC=ON \
-DHITLS_BUILD_SHARED=ON \
-DHITLS_BUILD_EXE=ON
\"$CMAKE\" --build \"$ROOT/build\" -j 4
\"$CMAKE\" --install \"$ROOT/build\"
鸿蒙 PC 只执行已签名的 ELF,主程序和所有依赖的 .so 都要签
SIGN_TOOL=\"$SDK_NATIVE/../toolchains/lib/binary-sign-tool\"
OBJCOPY=\"$SDK_NATIVE/llvm/bin/llvm-objcopy\"
for f in \"$ROOT\"/install/bin/hitls \"$ROOT\"/install/lib/libhitls_*.so; do
\"$OBJCOPY\" --remove-section .codesign \"$f\" 2>/dev/null || true
\"$SIGN_TOOL\" sign -inFile \"$f\" -outFile \"$f.signed\" -selfSign 1
mv \"$f.signed\" \"$f\"
done
openssl 不可用时,安装规则会留下空的 hmac 文件,这里一并清理
rm -f \"$ROOT/hitls.hmac\" \"$ROOT/install/bin/hitls.hmac\"`
赋予执行权限并运行:
chmod +x build.sh
./build.sh
十、在自己的项目中使用
编译一个调用 openHiTLS 的示例程序:
\"$SDK_NATIVE/llvm/bin/clang\" \\
--target=aarch64-linux-ohos \\
--sysroot=\"$SDK_NATIVE/sysroot\" \\
-D__MUSL__ \\
-I install/include/hitls/crypto \\
-I install/include/hitls/bsl \\
app.c \\
-L install/lib \\
-lhitls_crypto \\
-lhitls_bsl \\
-Wl,-rpath,\"$PWD/install/lib\"
上面的 rpath 指向当前工程的安装目录;如果最终把可执行文件放进 install/bin/,也可以改成 -Wl,-rpath,'$ORIGIN/../lib'。
如果使用 TLS 或 PKI 功能,再按需链接 libhitls_tls、libhitls_pki,并补充对应的头文件目录。
注意:你自己编译出的可执行文件和共享库同样需要签名后才能运行。
十一、让 hitls 在任意目录可用
前面的命令需要先进入安装目录,或者写完整的 install/bin/hitls 路径。最后一步把 hitls 加入 PATH,以后在任意目录直接执行即可。
1. 创建包装脚本
`mkdir -p ~/.local/bin
cat > ~/.local/bin/hitls <<'EOF'
!/bin/sh
exec \"$HOME/Documents/openhitls/install/bin/hitls\" \"$@\"
EOF
chmod +x ~/.local/bin/hitls`
包装脚本本身是 shell 脚本,由系统 /bin/sh 解释执行,不需要额外签名;实际调用的是已经签名的 hitls。
2. 把 ~/.local/bin 加入 PATH
zsh 用户:
`grep -qxF 'export PATH=\"$HOME/.local/bin:$PATH\"' ~/.zshrc || \
echo 'export PATH=\"$HOME/.local/bin:$PATH\"' >> ~/.zshrc
source ~/.zshrc`
如果使用 bash,把 ~/.zshrc 换成 ~/.bashrc。
3. 验证
cd /
hitls version
输出:
openHiTLS 0.4.0 31 Mar. 2026
以后无论在哪个目录,都可以直接运行:
hitls rand -hex 16
注意:如果以后移动了 openHiTLS 的安装目录,需要同步修改 ~/.local/bin/hitls 里的路径。
十二、关键点回顾
- 鸿蒙原生工具链已经包含 Clang、CMake、Ninja 和 sysroot,不需要额外安装构建环境。
- 工具链的系统名是
OHOS,openHiTLS 需要显式加-DHITLS_BSL_SAL_LINUX=ON。 - CLI 在 musl 下需要补
#include <sys/time.h>。 - 设置
RUNPATH=$ORIGIN/../lib后,CLI 可以直接找到共享库。 - 鸿蒙 PC 会校验 ELF 签名,主程序和所有
.so都必须签名;静态库不需要。 - 自签名适合开发和本机使用,正式发布建议使用 HNP 或官方签名流程。
- 将
~/.local/bin加入PATH后,可以在任意目录直接运行hitls。
项目地址:
https://gitcode.com/openHiTLS/openhitls
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论