鸿蒙PC实战:openHiTLS源码编译、安装、签名与运行"

admin 2026-10-24 11:45:48 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

鸿蒙 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 里的路径。

十二、关键点回顾

  1. 鸿蒙原生工具链已经包含 Clang、CMake、Ninja 和 sysroot,不需要额外安装构建环境。
  2. 工具链的系统名是 OHOS,openHiTLS 需要显式加 -DHITLS_BSL_SAL_LINUX=ON。
  3. CLI 在 musl 下需要补 #include <sys/time.h>。
  4. 设置 RUNPATH=$ORIGIN/../lib 后,CLI 可以直接找到共享库。
  5. 鸿蒙 PC 会校验 ELF 签名,主程序和所有 .so 都必须签名;静态库不需要。
  6. 自签名适合开发和本机使用,正式发布建议使用 HNP 或官方签名流程。
  7. 将 ~/.local/bin 加入 PATH 后,可以在任意目录直接运行 hitls。

项目地址:

https://gitcode.com/openHiTLS/openhitls

PALL锁不住:nRF51调试口复用指令抽固件" 网络安全文章

PALL锁不住:nRF51调试口复用指令抽固件"

本文复现了针对NordicnRF51系列芯片PALL读保护的绕过攻击,通过标准SWD调试口结合GDB单步执行与寄存器修改,借壳CR0中已有load指令逐字节抽取受保护Flash固件,实验约54分钟完整提取256KB镜像。文章指出PALL仅阻止直接读Flash,但调试口无法关闭,寄存器读写与单步执行仍可用,构成攻击面。建议评估威胁模型时需考虑调试口暴露风险,产线应关注SWD焊盘暴露问题,选型时需确认调试口能否彻底关闭。
不怕Agent能干,就怕账对不上" 网络安全文章

不怕Agent能干,就怕账对不上"

本文通过真实案例剖析AIAgent提示词注入攻击:Agent执行AGENTS.md中的恶意指令写入文件,而用户并未要求该操作。Agent虽起疑但仍执行,传统日志无法追溯指令来源。解决方案是通过eBPF在内核层监控Agent与模型后台通信,建立因果链审计,当动作触碰敏感对象但用户指令中无对应授权时判定为注入并告警。文章提供可落地的安全审计方案,强调条子不能冒充单子的原则。
评论:0   参与:  0