From d58be7412314b2402942ec8b8c705d4857167040 Mon Sep 17 00:00:00 2001 From: chakcy <947105045@qq.com> Date: Wed, 14 Oct 2026 15:29:25 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=94=9F=E6=88=90=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E8=A1=A5=E9=BD=90=20--encrypt/--license=20=E6=9E=84=E5=BB=BA?= =?UTF-8?q?=E5=A5=91=E7=BA=A6=EF=BC=88=E7=BD=91=E5=85=B3=E6=94=B6=E9=9B=86?= =?UTF-8?q?=E9=A1=B9=E3=80=81[license]=20=E6=B3=A8=E5=85=A5=E7=82=B9?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - config.toml:--encrypt 会先 PyArmor 混淆 main.py / server.py,PyInstaller 静态 分析跟不到 `from chongming.app import app`,网关包整个漏收(打包"成功"、产物 启动报 No module named 'chongming')—— 显式列 chongming / chongming.app 等入口包; - public/config.toml:补 [license] 段(public_key 留空),--license 的注入点; - README.project.md:补授权公钥前置条件(keygen → license_public.key 或环境变量), 以及 --only 对 obfuscate 同样划界(加密构建要显式带上,否则混淆被静默跳过)。 --- README.project.md | 7 +++++++ config.toml | 14 +++++++++++++- public/config.toml | 8 ++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/README.project.md b/README.project.md index a1fdd9c..c4e89b3 100644 --- a/README.project.md +++ b/README.project.md @@ -95,7 +95,14 @@ uv run build --encrypt --license # 对外分发:加密插件模块 + 注 uv run build --only mbank # 只重新生成 plugins.mbank(插件热更新只需替换该文件) ``` +- `--encrypt --license` 需要厂商授权公钥(未提供会直接构建失败):先 + `uv run chongming-license keygen -o license_private.pem` 生成密钥对(一次性;私钥离线保管, + 绝不进仓库/产物),把输出的公钥写入根目录 `license_public.key`(或用 + `CHONGMING_LICENSE_PUBKEY` / `CHONGMING_LICENSE_PUBKEY_FILE` 指定),再构建 - 无前端时跳过 vue 步骤:`uv run build pyinstaller --only mbank,prepare,pack` + (`--only` 对**所有**步骤划界:加密构建还要显式带上 `obfuscate`,如 + `uv run build --encrypt --license --only mbank,prepare,obfuscate,pack,license_guard`, + 否则 PyArmor 混淆会被静默跳过) - 插件代码在 `plugins.mbank` 里 → 换文件即可热更新;**网关本体是普通依赖** → 升级网关需改 `pyproject.toml` 版本(或 `uv lock --upgrade-package chongming-gateway`) 并重新 `uv run build` diff --git a/config.toml b/config.toml index c6a8737..9d2e689 100644 --- a/config.toml +++ b/config.toml @@ -81,7 +81,11 @@ config_path = "./config/workers/config.toml" [pyinstaller_build_import] # 打包收集清单(PyInstaller --hidden-import / Nuitka --include-module),`uv run build` 的 -# pack 步骤使用。网关本体依赖随 chongming-gateway 包发布、静态分析可跟到;这里保留: +# pack 步骤使用。网关本体(chongming-gateway 包)**未混淆时**能沿骨架的 +# `from chongming.app import app` 静态跟到;但 --encrypt 会先 PyArmor 混淆 +# main.py / server.py,此时静态分析跟不到,网关入口包必须显式列出(见 base 前几项)。 +# 这里保留: +# - 网关入口包(chongming / chongming.app 与骨架直接引用的子模块) # - 动态导入、静态分析看不到的(granian 内部子模块、amqtt 插件、sqlite_vfs 等) # - public 骨架自身(server / utils)与服务器可选实现(uvloop 等) # 内置插件专属依赖(网关本体不 import 的第三方包)写根目录 plugins_deps.toml,按插件分节声明。 @@ -90,6 +94,14 @@ base = [ "utils.launch", "utils.config", "server", + # 网关入口包:--encrypt 时 main.py / server.py 先被 PyArmor 混淆,里面的 + # `from chongming.app import app` 对 PyInstaller 静态分析不可见 —— 漏了会在 + # 打包期"成功"、产物启动即报 + # "无法导入网关(chongming.app): No module named 'chongming'" + "chongming", + "chongming.app", + "chongming.app.core.logger", + "chongming.app.core.parent_death", "module_bank", "granian", "granian._compat", diff --git a/public/config.toml b/public/config.toml index 786dabd..c753141 100644 --- a/public/config.toml +++ b/public/config.toml @@ -28,6 +28,14 @@ launch_worker_count = "cache" algorithm = "HS256" secret_key = "your-secret-key-change-in-production" +[license] +# 机器码授权(厂商 Ed25519 签发):`uv run build --license` 在打包前把厂商公钥注入 +# 这里,并把"本产物是否为授权版"烘焙进产物代码(编译后部署侧改不了)。 +# public_key 留空 = 未接入授权:开发态不校验;未加 --license 的产物也不校验 +# (插件照常加载,不是砖头包)。可选键:path(授权文件,默认 ./license.lic)、 +# min_match(指纹容错阈值)、enabled(仅开发态生效;打包产物以构建期烘焙为准)。 +public_key = "" + [production] debug = false env = "production"