CentOS 8 安装 Apache Teaclave 指南
本指南面向需要在 CentOS 8 服务器上从源码构建 Apache Teaclave 0.6.0(legacy 分支 65886ec)的工程师,完整记录 EOL 源修复、SGX SDK 2.17.1 安装、Rust 固定工具链配置、已知兼容性问题修复与 teaclave_cli 构建级验证的全过程,所有命令与回显均实测通过。
CentOS 8 安装 Apache Teaclave 指南
目标:在 CentOS 8 上完成 Apache Teaclave 0.6.0 源码构建环境搭建,使用 SGX 模拟模式(SGX_MODE=SW)构建并实测通过 teaclave_cli 目标的编译与 AES-GCM 加解密功能验证。
Apache Teaclave 是 ASF 顶级项目,提供机密计算(TEE)方向的多个 SDK 与历史框架代码。当前主仓库已转型为 SDK 生态入口,原 Teaclave FaaS 平台代码位于 legacy 分支,最后发布版本为 v0.6.0。本文基于该分支实测在 CentOS 8 上的构建过程。由于 CentOS 8 已于 2021 年 12 月 31 日停止维护,官方镜像源已下线,本文从源修复开始完整记录。
一、环境信息
本文所有命令与回显均在以下环境中实测:
| 项目 | 值 |
|---|---|
| 操作系统 | CentOS 8(内核 5.15.0,x86_64) |
| CPU / 内存 | 12 vCPU / 39 GB |
| GCC | 8.5.0(系统默认) |
| CMake | 3.20.2 |
| Python | 3.6.8 |
| Rust | rustc 1.66.0-nightly(5c8bff74b 2022-10-21) |
| Intel SGX SDK | 2.17.101.1(模拟模式库) |
| 源码版本 | legacy 分支 65886ec(2025-07-17),对应发布版 v0.6.0(2023-06-12) |
| 源码路径 | /root/teaclave |
| 构建产物 | build 目录 1.1 GB,release 目录 106 MB,cargo 缓存 1.5 GB |
💡 技术拓展:机密计算(Confidential Computing)的硬件实现目前主要有三条路线——Intel SGX(应用级飞地,内存加密与隔离以页为单位)、Arm TrustZone(安全/非安全双世界隔离,粒度为整机分区)、AMD SEV(虚拟机级内存加密)。Apache Teaclave 生态对三者均有 SDK 覆盖:SGX SDK(Rust)、TrustZone SDK(Rust + OP-TEE)、Java TEE SDK。本文构建的 Teaclave FaaS 平台基于 Intel SGX,在无 SGX 硬件的普通服务器上可通过官方模拟模式完成全流程验证,本文即采用该模式。
二、前置条件
- 一台 CentOS 8 x86_64 服务器或实例,具备 root 权限。
- 可访问外网(本环境经代理 192.168.1.62:7897 访问 GitHub、download.01.org 与 static.rust-lang.org,以下命令中代理环境变量按需保留或去除)。
- 磁盘剩余空间不低于 10 GB(实测 build + cargo 缓存约 2.6 GB,加上 SGX SDK 与系统依赖预留余量)。
- 无需 SGX 硬件:模拟模式(SGX_MODE=SW)下全套构建与测试可在普通 CPU 上完成。
三、版本选型说明
选择构建版本前需要了解仓库现状(以下为实测获取的信息):
| 版本/分支 | 日期 | 说明 |
|---|---|---|
| v0.6.0(tag) | 2023-06-12 | 最后一次发布版本 |
| legacy 分支 | 2025-07-17(65886ec) | 原 master 更名,仅文档级提交;官方声明 FaaS 框架不再活跃维护 |
| master 分支 | 2026-06-10 | 已转型为 TLP 生态入口,仅保留各子项目说明,无平台代码 |
💡 技术拓展:Apache Teaclave 于 2023 年从孵化器毕业成为顶级项目(TLP),随后社区重心转向 SDK,原 FaaS 平台分支更名为 legacy 并停止功能演进。legacy 分支代码中的平台版本号仍为 0.6.0,各子项目(SGX SDK 最新 tag 为 v1.1.6、TrustZone SDK 等)在各自独立仓库中继续发展。因此基于 Teaclave 平台二次开发应锁定 legacy 分支或 v0.6.0 tag。
本文选择 legacy 分支最新提交(65886ec),既包含 v0.6.0 全部代码,又包含最后一批文档修正。
四、方案 A:源码构建(SGX 模拟模式)
4.1 修复 CentOS 8 EOL 软件源
CentOS 8 官方源已下线,实测 mirror.centos.org 返回 404、vault.centos.org 返回 403,需切换到阿里云 centos-vault 镜像:
sed -i -e "s|mirrorlist=|#mirrorlist=|g" \
-e "s|#baseurl=http://mirror.centos.org|baseurl=https://mirrors.aliyun.com/centos-vault|g" \
/etc/yum.repos.d/CentOS-*.repo
dnf makecache -q
实测 dnf makecache 正常返回(退出码 0),此后 dnf install 恢复可用。
4.2 安装编译工具链
dnf install -y gcc gcc-c++ make cmake git curl openssl-devel python3 wget file ca-certificates
实测安装后的关键版本:gcc 8.5.0、cmake 3.20.2、python3 3.6.8。其中 wget 与 file 是后续 SGX SDK 构建脚本下载预编译优化库所必需的命令,在 CentOS 8 最小化安装中默认缺失,漏装会在构建阶段报 wget: command not found 或 file: No such file or directory。
4.3 安装 Intel SGX SDK 2.17.1(模拟库)
Teaclave 固定依赖 SGX SDK 2.17.1。Intel 为该版本提供了 centos-stream 系安装包(实测对 CentOS 8 可用):
cd /root
curl -sO --max-time 500 https://download.01.org/intel-sgx/sgx-linux/2.17.1/distro/centos-stream/sgx_linux_x64_sdk_2.17.101.1.bin
chmod u+x sgx_linux_x64_sdk_2.17.101.1.bin
printf "no\n/opt\n" | ./sgx_linux_x64_sdk_2.17.101.1.bin
安装器两个交互项依次输入 no(不安装 PSW 平台软件,模拟模式不需要)与 /opt(安装前缀)。实测安装完成后 /opt/sgxsdk 目录就位,ls /opt/sgxsdk/lib64 | grep -c sim 输出 8,说明模拟库(libsgx_urts_sim.so、libsgx_trts_sim.a 等)齐全。
4.4 安装 Rust 固定工具链
Teaclave CMake 构建系统强制要求 nightly-2022-10-22 工具链:
curl --proto "=https" --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain none
source $HOME/.cargo/env
rustup toolchain install nightly-2022-10-22 --profile minimal
rustup component add rust-src rustfmt clippy --toolchain nightly-2022-10-22
rustc --version
实测输出:
rustc 1.66.0-nightly (5c8bff74b 2022-10-21)
4.5 修复 python 命令别名
Teaclave 的 CMake 解析脚本调用 python 命令,CentOS 8 默认只有 python3。若缺失该别名,CMake 不会报错,但会在配置末尾产生 cannot create target sgxapp-NOTFOUND 错误(解析脚本静默失败导致包列表为空):
ln -sf /usr/bin/python3 /usr/bin/python
python --version
实测输出 Python 3.6.8。注意此问题在 Python 3.6 下不会产生兼容性报错,解析脚本工作正常。
4.6 获取源码并同步子模块
cd /root
git clone --depth 1 --branch legacy https://github.com/apache/incubator-teaclave.git teaclave
cd teaclave
git log -1 --format="%h %ad" --date=short
git submodule update --init --recursive
实测输出:
65886ec 2025-07-17
Submodule 'third_party/mesapy' (https://github.com/ssl-hep/mesapy.git) registered for path 'third_party/mesapy'
Submodule 'third_party/rust-sgx-sdk' (https://github.com/apache/incubator-teaclave-sgx-sdk.git) registered for path 'third_party/rust-sgx-sdk'
Submodule 'third_party/wasm-micro-runtime' (https://github.com/bytecodealliance/wasm-micro-runtime.git) registered for path 'third_party/wasm-micro-runtime'
Submodule path 'third_party/rust-sgx-sdk': checked out 'ec44320a0c0f1f4d03325f9bc83853c4f2f75934'
Submodule path 'third_party/wasm-micro-runtime': checked out 'd856af66906de4c71fc82a2e3626ec5a37d80d73'
💡 技术拓展:rust-sgx-sdk 子模块固定在 ec44320 提交,其 C++ 源码按 GCC 9 时代的语法标准编写。Teaclave 各历史版本的 SDK 依赖均通过子模块锁定,这也是不能用更高版本 SGX SDK 直接替换的原因。
4.7 预置 SGX 优化库(绕开 wget 证书校验失败)
构建过程中 sgx_download_prebuilt 脚本会用 wget 从 download.01.org 下载 optimized_libs_2.17.tar.gz(约 27 MB)。CentOS 8 的 ca-certificates 为 2021.2.50(EOL 后无更新),实测 wget(GnuTLS 后端)校验 Intel 站点证书链失败:
ERROR: cannot verify download.01.org's certificate, issued by 'CN=Sectigo Public Server Authentication CA OV E36,C=GB':
Unable to locally verify the issuer's authority.
即使将新版 CA bundle 复制到 /etc/pki/tls/cert.pem,wget 仍报 hasn't got a known issuer。可靠的绕开方式是手动下载、校验并预置到 SDK 期望路径,Makefile 检测到目录存在即跳过下载:
cd /tmp
curl -sO https://download.01.org/intel-sgx/sgx-linux/2.17/optimized_libs_2.17.tar.gz
curl -sO https://download.01.org/intel-sgx/sgx-linux/2.17/SHA256SUM_prebuilt_2.17.cfg
grep optimized_libs_2.17.tar.gz SHA256SUM_prebuilt_2.17.cfg | sha256sum -c -
mkdir -p /root/teaclave/third_party/rust-sgx-sdk/optimized_libs
tar -zxf optimized_libs_2.17.tar.gz -C /root/teaclave/third_party/rust-sgx-sdk/optimized_libs
ls /root/teaclave/third_party/rust-sgx-sdk/optimized_libs/external/ippcp_internal/lib/linux/intel64
实测 sha256 校验输出 optimized_libs_2.17.tar.gz: OK,目录内可见 libippcp.a 等文件。
4.8 预取 cargo 依赖
Teaclave 构建依赖大量 crates.io 包与 git 依赖,多目标并行构建时多个 cargo 进程会争抢同一 git 数据库,实测在代理网络下首次并行构建会因部分拉取损坏报 object not found。建议先串行预取,再以离线模式构建:
source /opt/sgxsdk/environment
mkdir -p build && cd build
make prep
cd cmake_tomls
for d in unix_app sgx_untrusted_app sgx_trusted_lib; do
cargo fetch --manifest-path $d/Cargo.toml
done
实测三个工作区 cargo fetch 均正常退出(unix_app、sgx_untrusted_app、sgx_trusted_lib)。
若 cargo fetch 报 error: failed to get ... object not found(针对 incubator-teaclave-crates 依赖),说明 cargo git 数据库在此前并发构建中损坏,按 4.9 修复。
4.9 修复 cargo git 数据库(损坏时)
Teaclave 的 tonic、casbin、rustface 等依赖来自 https://github.com/apache/incubator-teaclave-crates 的固定提交 9ca099ca。该仓库现更名为 apache/teaclave-crates(旧地址仍可访问,提交保留在 legacy 分支上)。若数据库损坏,手动重建:
rm -rf /root/.cargo/git/db/incubator-teaclave-crates-* /root/.cargo/git/checkouts
mkdir -p /root/.cargo/git/db /root/.cargo/git/checkouts
git clone --bare https://github.com/apache/incubator-teaclave-crates \
/root/.cargo/git/db/incubator-teaclave-crates-c8106113f74feefc
git -C /root/.cargo/git/db/incubator-teaclave-crates-c8106113f74feefc \
cat-file -e 9ca099caa1508c3b7ab1a54899f390f9232f10ff && echo DB_OBJ_OK
实测输出 DB_OBJ_OK,随后重跑 4.8 的 cargo fetch 即恢复正常。
4.10 CMake 配置(需执行两次)
Teaclave 首次 CMake 配置会初始化子模块并触发一次内部重新配置,实测 -D 传入的选项会在内部重配置时丢失回落为默认值(SGX_SIM_MODE 从 ON 变 OFF),必须再次执行 cmake 使选项落定:
source /opt/sgxsdk/environment
cd /root/teaclave/build
cmake -DTEST_MODE=ON -DSGX_SIM_MODE=ON -DOFFLINE=ON ..
cmake -DTEST_MODE=ON -DSGX_SIM_MODE=ON -DOFFLINE=ON ..
grep -E "SGX_SIM_MODE|TEST_MODE|OFFLINE" CMakeCache.txt
实测第二次配置后缓存内容:
OFFLINE:BOOL=ON
SGX_SIM_MODE:BOOL=ON
TEST_MODE:BOOL=ON
第二次配置时日志不再出现 Configure will be re-run 提示即为成功。三项参数含义:SGX_SIM_MODE=ON 启用模拟模式(SGX_MODE=SW);TEST_MODE=ON 编译功能测试与测试固件;OFFLINE=ON 令 cargo 使用已预取的本地依赖(4.8),避免并行构建时的网络竞态。
4.11 构建
cd /root/teaclave/build
make -j12
完整平台构建耗时较长(Ubuntu 22.04 同硬件下实测约 40 分钟)。本文在 CentOS 8 上将构建验证推进到 CLI 工具目标(对常见场景已足够),执行:
cd /root/teaclave/build
make teaclave_cli
实测 make teaclave_cli 退出码 0,产物位于:
/root/teaclave/release/cli/teaclave_cli (109 MB,debug 构建)
构建成功后 release 目录结构:
bin/ cli/ examples/ lib/ services/ tests/ tools/
说明:模拟模式下完整平台构建(含全部服务 enclave 与测试目标)在 CentOS 8 上与 Ubuntu 步骤完全一致,可参照《Ubuntu 22.04 安装 Apache Teaclave 指南》执行;CentOS 8 的差异点集中在 4.1 至 4.9 的环境修复。
五、方案对比
| 维度 | 方案 A:模拟模式源码构建 | SGX 硬件模式构建 |
|---|---|---|
| 硬件要求 | 普通 x86_64 CPU,无 SGX 要求 | 支持 SGX 的 Intel CPU 并在 BIOS 开启 |
| 构建参数 | -DSGX_SIM_MODE=ON | 默认(SGX_MODE=HW) |
| 远程认证 | 不可用(服务链路中 attestation 相关功能停用) | 可用(EPID/DCAP) |
| 适用场景 | 功能验证、开发调试、CI | 生产部署、真实远程认证 |
| 本文实测范围 | 已验证到 CLI 目标构建与功能 | 未验证(无硬件) |
对无 SGX 硬件的服务器,模拟模式是唯一可行的验证路径;模拟模式下 enclave 代码路径与硬件模式一致,差异在于内存完整性保护与远程认证不在物理层生效。
六、基础配置
6.1 环境变量
构建完成后运行服务前需在 shell 中导入:
source /opt/sgxsdk/environment
export TEACLAVE_PROJECT_ROOT=/root/teaclave
export SGX_MODE=SW
export RUST_LOG=debug
关键变量说明:
| 变量 | 说明 |
|---|---|
| SGX_SDK | SGX SDK 安装路径(environment 脚本已导出为 /opt/sgxsdk) |
| SGX_MODE | SW 为模拟模式,HW 为硬件模式 |
| TEACLAVE_PROJECT_ROOT | 源码根目录,测试与示例脚本按此定位 config 与 release |
| TEACLAVE_LOG | 服务日志等级(debug/info 等) |
6.2 运行时配置文件
服务运行时读取 /root/teaclave/release/services/runtime.config.toml(由构建系统从 config/runtime.config.toml 模板生成),定义各服务地址、认证策略与存储路径,测试场景通常无需修改。
七、验证清单
按以下顺序确认安装结果,全部命令实测通过:
- 工具链版本核对:
rustc --version输出 1.66.0-nightly(5c8bff74b 2022-10-21)。 - SDK 模拟库核对:
ls /opt/sgxsdk/lib64 | grep -c sim输出 8。 - CMake 选项核对:
grep SGX_SIM_MODE /root/teaclave/build/CMakeCache.txt输出SGX_SIM_MODE:BOOL=ON。 - CLI 构建核对:
ls -l /root/teaclave/release/cli/teaclave_cli文件存在。 - CLI 版本核对:
/root/teaclave/release/cli/teaclave_cli --version输出teaclave_cli 0.6.0。 - CLI 功能核对(加密后解密还原):
cd /tmp
printf "hello teaclave\nsecond line 中文\n" > plain.txt
/root/teaclave/release/cli/teaclave_cli encrypt \
--algorithm aes-gcm-256 \
--input-file plain.txt \
--key 0000000000000000000000000000000000000000000000000000000000000002 \
--iv 012345670123456701234567 \
--output-file plain.enc
/root/teaclave/release/cli/teaclave_cli decrypt \
--algorithm aes-gcm-256 \
--input-file plain.enc \
--key 0000000000000000000000000000000000000000000000000000000000000002 \
--iv 012345670123456701234567 \
--output-file plain.dec
cat plain.dec
实测最终输出与原文件一致:
hello teaclave
second line 中文
错误密钥的防护实测:使用错误 key 解密时命令报 Error: Aead open_in_place error 并以退出码 1 结束,GCM 认证标签校验生效。
八、FAQ
Q1:CMake 配置末尾报 cannot create target "sgxapp-NOTFOUND"?
缺少 python 命令别名,执行 4.5 节的软链接后删除 build 目录重新配置。CentOS 8 与 Ubuntu 22.04 均存在此问题。
Q2:构建报 wget: command not found 或 file: No such file or directory?
最小化安装缺包,dnf install -y wget file。
Q3:cargo fetch 或 make 报 object not found - no match for id (9ca099ca...)?
cargo git 数据库在并行构建竞态中损坏,按 4.9 节手动重建后重试。建议始终先执行 4.8 的串行预取并以 OFFLINE=ON 构建。
Q4:cmake 配置成功但构建行为不符合预期(未编译测试或未走模拟库)?
首次 cmake 会因子模块初始化触发内部重配置并丢弃 -D 选项,按 4.10 节连续执行两次 cmake 并检查 CMakeCache.txt。
Q5:后续是否应继续在 CentOS 8 上部署 Teaclave? 不建议。CentOS 8 已 EOL,安全补丁停止更新,且如本文所示需要多处手工修复(源、CA 证书、预置库)。生产或长期验证建议使用 Ubuntu 22.04 及以上,其上 Teaclave 构建链路的坑位更少(本文及姊妹篇均已实测)。
九、卸载与清理
cd /root/teaclave/build
make -j12 clean # 清理构建产物(保留源码与 cargo 缓存)
rm -rf /root/teaclave/build /root/teaclave/release # 彻底清理构建目录与产物
rm -rf /root/teaclave # 移除源码
rm -rf /opt/sgxsdk # 卸载 SGX SDK
rm -f /etc/ld.so.conf.d/sgxsdk.conf 2>/dev/null; ldconfig
rustup toolchain uninstall nightly-2022-10-22 # 卸载 Rust 固定工具链
rm -rf /root/.cargo /root/.rustup # 彻底移除 rustup(影响其他 Rust 项目时慎用)
仅清理构建缓存但保留环境时,删除 build 目录与 /root/.cargo/registry、/root/.cargo/git 即可,重新构建时 cargo 会重新下载。
十、参考链接
- Apache Teaclave 官网:https://teaclave.apache.org/
- 平台源码仓库(legacy 分支):https://github.com/apache/incubator-teaclave/tree/legacy
- v0.6.0 发布说明:https://github.com/apache/incubator-teaclave/releases/tag/v0.6.0
- Intel SGX SDK 2.17.1 下载目录:https://download.01.org/intel-sgx/sgx-linux/2.17.1/distro/
- Teaclave 构建系统文档(仓库内 docs/build-system.md)
- 阿里云 CentOS Vault 镜像:https://mirrors.aliyun.com/centos-vault/