- U0:新建 plantai-rag-new-venv(3.12.13,130 包),torch 2.13.0+cpu/cython 3.2.8/faiss 1.14.3/openai 3.3.1,requirements.lock 固化 - U1:四树全 venv 重编译(sdk 15/qa 45/methodology 28/legacy 283 .so 全 cp312),audit 双审计过 - U2:备用端口影子对照:金标 search evidence 30/30 与生产一致、SDK pytest 125 过、五上游绿 - U3:统一树切终态 8091/8092/8093 + BFF 8090(venv),停旧服务(容器/进程不删,30 天窗) - U4:minerupy311→minerupy312 断链修复、GF_PYTHON_ENV 回退统一、start-dev/run/bff_restart 去 conda、server.env/README 更新 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
PlantAI + RAG 服务端保护流程
本目录只放服务端构建、加密与授权工具。供应商私钥、私钥口令和版本主密钥不得复制到客户机。
新的阶段顺序
阶段 A 现在执行完整的代码硬化链:
- 从
server.env读取PLANTAI_SOURCE和RAG_SOURCE。 - Cython 生成 C 扩展。
- GCC 使用
-fvisibility=hidden编译。 strip --strip-unneeded删除普通符号表和调试信息。- ELF 工具把除
PyInit_*外的已定义动态符号标记为 hidden,并逐个复核。 - 对完整目录计算摘要、写入
.hardened-build.json,再执行代表性导入/行为冒烟测试。 - 全部成功后,才把临时目录原子移动为
PlantAI_compiled.new和RAG.new。
阶段 C 会重新校验目录摘要、Python ABI、ELF 符号状态和冒烟测试。缺少构建标记、目录被修改、ABI 不一致或测试失败时都会停止,不会生成发行包。
0. 配置
只修改:
cd /home/xzq/5090/PlanAI-cooperate/hsj-workspace/encryption-test/server/plantai_server_package
vi server.env
至少确认这些值:
PLANTAI_SOURCE=/your/PlantAI/source
RAG_SOURCE=/your/RAG/source
PLANTAI_PYTHON=/path/to/python
VERSION=1.0.0
PLANTAI_PYTHON 必须与客户运行环境的 Python 大版本、小版本和 ABI 一致,并已安装 Cython。
A. 编译、隐藏符号、strip 和验证
cd /home/xzq/5090/PlanAI-cooperate/hsj-workspace/encryption-test/server/plantai_server_package
bash phase_a_compile_all.sh
验收:
find ../PlantAI_compiled.new ../RAG.new -type f -name '*.c'
find ../PlantAI_compiled.new ../RAG.new -type f -name '*.so' | wc -l
python3 tools/audit_compiled_tree.py \
--tree ../PlantAI_compiled.new --project PlantAI --require-marker
python3 tools/audit_compiled_tree.py \
--tree ../RAG.new --project RAG --require-marker
第一条应无输出,两个审计命令应返回 "ok": true。阶段 A 为防止覆盖而拒绝已存在的 .new 目录;确认旧产物不再需要后,由操作者自行改名或移走。
B. 初始化供应商密钥和版本主密钥
仅首次初始化供应商签名密钥:
bash phase_b_init_supplier.sh
每个新 VERSION 都生成独立主密钥:
bash phase_b_new_release_key.sh
C. 构建联合发行包
阶段 C 默认读取 server.env 中的 PLANTAI_COMPILED 和 RAG_COMPILED;它们应指向阶段 A 的 .new 目录。
bash phase_c_build_dual_release.sh
脚本拒绝覆盖同版本的旧暂存目录或压缩包。确认旧文件后自行移走,再重新执行。成功后输出:
out/plantai-rag-release-<VERSION>.tar.gz
D-F. 客户交付与授权
继续使用现有阶段脚本:
bash phase_d_swtpm_test.sh # 仅软件 TPM 测试
bash phase_e_issue_license.sh # 绑定客户设备并签发授权
bash phase_f_acceptance.sh # 验收
生产环境不要设置 ALLOW_SOFTWARE_TPM_TEST=1。代码的 .so 硬化提高逆向成本,但不是不可逆的保密边界;真正的机密仍应放在 TPM 解封后才出现的加密运行资产中。
常见失败
Output already exists:为防覆盖而停止,人工检查并移走旧.new。marker_missing:输入不是由新阶段 A 生成,阶段 C 会拒绝。marker_mismatch:阶段 A 后目录发生变化,必须重新构建并测试。python_abi_suffix_mismatch:编译 Python 与当前校验/运行 Python ABI 不一致。visible_non_pyinit或symtab_present:符号隐藏或 strip 未达到要求。- 冒烟测试失败:不要继续打包;先在源码或依赖环境中解决兼容问题。