Development & Runtime
dsh-scholar-access
blankwy/dsh-scholar-access · ★ 2
Campus Scholar Access Accelerator for DeepSeek Harness: route DSH's own international traffic (GitHub, Hugging Face, npm, PyPI) over the CERNET academic channel via its DoH resolver and reverse…
README body is shown in Chinese.
Manifest details
安装
dsh plugin --profile web add 'github:blankwy/dsh-scholar-access#99275ad9c4c1a4094677950b106bf482f22100a1'GitHub 源码安装:首次需按提示配置 allowBuilds 构建授权后重试
For install and environment setup, plus plugin development tutorials, see DSH community docs ↗
README
Table of contents
让 DeepSeek Harness 自己在校园网里走通 GitHub、Hugging Face、npm、PyPI —— 包括 DSH 的插件、模型请求、插件市场索引源,以及 agent 派生的
git/npm/pip子进程。
A DeepSeek Harness plugin that carries DSH's own international traffic over the CERNET academic channel (scholar.edu.cn) using its DoH resolver and reverse proxy — with explicit, revocable, per-process certificate trust instead of a machine-wide install.
这是什么
很多高校通过 CERNET 的「国际学术资源访问专用通道」开放 GitHub、Hugging Face、arXiv 等站点。官方做法是下载 scholartools.exe / 专用浏览器,它会:
- 把系统 DNS 指向通道的 DoH 解析;
- 把通道反向代理的根证书装进本机证书库(整台机器所有程序都信任它);
- 每次访问都要保持客户端在跑。
这个插件把 1、2 两步搬进 DSH 进程内部,并且只对 DSH 自己生效:
| 层 | 通道侧 | 本插件 |
|---|---|---|
| 名字解析 | https://doh.scholar.work/dns-query,白名单域名解析到 205.164.0.0/16 |
进程内 DoH 客户端,命中通道段才接管,其余域名原样直连 |
| 加密信任 | 反向代理出示 Scholar Service ← Scholar Root CA v1 |
从真实握手链抓取并 pin 根证书,只在与通道地址通信时并入信任库 |
| 出口 | 反向代理集群 | ① 接管宿主 fetch ② 本地转发代理 ③ 子进程环境变量 |
关键点:没有本地中间人。 本地代理只做 TCP 隧道(CONNECT),TLS 端到端到通道反向代理;不存在插件自己签发证书。
特性
- 不需要 scholartools.exe 常驻,也不改系统 DNS、不写系统证书库。
- 默认不信任证书:先做一次不校验的握手,算出链上根指纹与内置 pin 比对,确认「指纹匹配」后由你点「信任证书」。
- 一键注销:停用并删除本地 PEM,通道立即失效。
- 系统信任开关:如果 scholartools 已经把根证书装进了本机库,插件能扫出来,并可用
Disallowed(不信任证书)库停用而不删除——用 scholartools 时再一键恢复。 - 可访问性测试:逐域名返回状态码、落地 IP、是否走通道、耗时、证书指纹是否匹配。
- 接管统计:真实记录宿主进程里有多少请求走了通道、多少直连、多少失败,按域名明细——不是口号。
- 开关、模式、证书信任全部在 设置 → 插件 → 校园网学术通道加速 一页里。
安装
从 GitHub 安装
在 DSH 里让 agent 执行:
plugin_manager { action: "install_bundle", target: "github:blankwy/dsh-scholar-access" }
若你的 DSH 版本不接受 GitHub spec,克隆到本地后按下面的「本地目录」方式安装即可。
本地目录(开发/自用)
git clone https://github.com/blankwy/dsh-scholar-access.git D:/path/to/dsh-scholar-access
plugin_manager { action: "install_bundle", target: "D:/path/to/dsh-scholar-access" }
装完必须重启一次 DSH
新 bundle 的 patch 由 Loader 在启动时组合,安装阶段只会写入 profile 的 package.json 与 bundle 列表(返回 application: "restart-required" 属正常)。之后修改插件代码同样需要重启。
自检(不需要起 DSH)
装之前可以先确认这台机器能不能用:
node scripts/verify.mjs # github.com / huggingface.co / registry.npmjs.org
node scripts/verify.mjs pypi.org arxiv.org
它会依次做:DoH 解析 → 连到通道地址 → 用内置 pin 校验证书 → 打印 status / ip / channel / pin。全部通过退出码为 0。
首次使用
- 打开 设置 → 插件 → 已安装 → 校园网学术通道加速。
- 点「检查系统证书库」——看看 scholartools 有没有把根证书装到本机级。
- 点「测试可访问性」——此时不校验证书,但会把链上根指纹和内置 pin 比对,应显示「指纹匹配」。
- 确认无误后点「信任证书」——通道立即生效。
- 想关掉:点「注销证书」,或直接关右上角总开关。
使用
设置页
| 区域 | 说明 |
|---|---|
| 总开关 | 即时生效,写盘持久化 |
| 运行状态 | DoH 健康、本地代理地址、宿主 fetch 是否接管、注入了多少环境变量、实测接管次数 |
| 证书信任(主动) | 信任 / 注销、本地 PEM 路径、pin 指纹、系统证书库扫描与开关 |
| 接管范围 | 自动:只接管已知国际站点;全量:所有域名先经 DoH 解析 |
| 可访问性测试 | 逐域名结果,含「通道/直连」与「指纹匹配」标记 |
Agent 工具
| 工具 | 用途 |
|---|---|
scholar_access_test |
批量测可达性,可传 targets |
scholar_access_status |
开关、DoH 健康、代理、注入的环境变量、证书指纹、接管统计 |
scholar_resolve |
单域名 DoH 解析,看是否落进通道段 |
命令行子进程
开启后,agent 派生的子进程会继承(关闭时精确恢复原值):
HTTPS_PROXY / HTTP_PROXY / NO_PROXY
SSL_CERT_FILE / CURL_CA_BUNDLE / GIT_SSL_CAINFO / REQUESTS_CA_BUNDLE
NODE_EXTRA_CA_CERTS
git ls-remote --heads https://github.com/nodejs/node
npm view react version
已经打开的旧终端继承的是旧环境,需要新开会话。
为什么没有
NODE_USE_ENV_PROXY:Node 24 在该变量存在时会让http(s).request也走环境代理,而本插件的通道请求就在同一个宿主进程里——那会把它们绕回插件自己的本地代理。所以插件不注入它;需要代理的 Node 脚本请自行开启($env:NODE_USE_ENV_PROXY=1,并已自动带上NODE_EXTRA_CA_CERTS)。
作用范围
覆盖
- 宿主进程里所有走
globalThis.fetch的代码:插件网络调用、模型请求、插件市场索引源、web 工具。 - agent 派生的子进程:
git、npm/pnpm、pip、huggingface-cli,以及自行开启NODE_USE_ENV_PROXY的 Node 脚本。
不覆盖
- 直接
net.Socket()/ 自带 DNS 的程序。 - 开启前已建立的长连接。
- 通道白名单之外的域名——按设计直连,走不动属于校园网出口限制。
证书与隐私(重要)
| 位置 | 本插件是否写入 | 说明 |
|---|---|---|
Windows CurrentUser\Root / CA |
否 | 从不写 |
Windows LocalMachine\Root / CA |
否 | 从不写(也不申请提权) |
$DSH_HOME/scholar-access/ca-bundle.pem |
仅「已信任」期间 | 注销时删除 |
$DSH_HOME/scholar-access/scholar-root.pem |
仅「已信任」期间 | 注销时删除 |
lib/scholar-ca.js |
随包分发 | 只是一段 PEM 文本,不被引用就不产生信任 |
信任只发生在两处,且都随开关消失:连接通道地址时把该根并入 Node 的 ca: 列表;子进程里通过环境变量指向那两个 PEM。
要说明的风险:通道反向代理对经通道的 HTTPS 流量做 TLS 终止,具备内容审计与实时改写能力(这是该通道的公开设计,不是本插件引入的)。插件能做的是把范围收窄、把事实摊开——默认不信任、只对通道地址生效、pin 指纹每次校验、状态页可见、一键注销。
关于系统信任开关:scholartools.exe 会把同一个根证书装进本机级证书库(全机器所有程序都信任),这与本插件无关。插件页可以扫出它,并用 Windows 的 Disallowed 库停用而不删除——证书仍在 Root 里,只是整机判定不受信任;恢复时从 Disallowed 移除即可。两个方向都需要管理员权限(会弹 UAC)。注意:走 Windows 证书库的浏览器(Edge / Chrome / Open 等)会受影响,Firefox 用自己的证书库不受影响。
配置
| 键 | 默认 | 说明 |
|---|---|---|
enabled |
true |
总开关初值(页面开关会覆盖并持久化) |
dohEndpoint |
https://doh.scholar.work/dns-query |
DoH 解析地址,可换成自建 |
mode |
auto |
auto / always |
patchHostFetch |
true |
是否接管宿主 fetch |
startProxy |
true |
是否启动本地转发代理 |
proxyPort |
0 |
0 = 自动分配 |
injectEnv |
true |
是否注入子进程环境变量 |
extraHosts |
[] |
额外强制走通道的域名 |
testHosts |
见默认值 | 测试列表 |
证书信任不是配置项,而是页面上的运行时状态(默认关闭),存在
state.json里。
数据与卸载
$DSH_HOME/scholar-access/(默认 C:\Users\<你>\.dsh\scholar-access\):
state.json— 开关、模式、是否已信任ca-bundle.pem— Mozilla 根 + 通道根(仅信任期间)scholar-root.pem— 仅通道根(仅信任期间)
卸载:plugin_manager { action: "remove_bundle", target: "dsh-scholar-access" },然后删掉上面整个目录、重启 DSH。若曾点过「信任证书」,先点「注销证书」把 PEM 清掉。
排错
| 现象 | 排查 |
|---|---|
测试失败且 channel:false |
DoH 没命中通道:确认在校园网内、dohHealth.ok 为 true;用 scholar_resolve github.com 看返回 IP |
全部失败,error: fetch failed |
校园网未开通该通道或出口限制 |
| 子进程仍不走通道 | 看 scholar_access_status 的 env.injected;新开终端会话 |
| 根证书「指纹不匹配」 | 通道换了证书。先关开关,抓新链更新 pin,不要直接信任 |
curl 报 schannel: AcquireCredentialsHandle failed |
Windows 自带 curl 是 schannel 构建,不认 PEM 形式的 CA。用 git / npm / node / python,或换 OpenSSL 版 curl |
| 某功能变慢 | 把 mode 切回 auto,或临时关总开关对比 |
已知限制
- 只在已开通该通道的校园网内有效。
- 通道白名单由运营方维护,名单外的域名仍然直连。
always模式会给每个新域名加一次 DoH 查询(有缓存),非必要不用。- 证书 pin 需要随通道换证更新:
lib/scholar-ca.js里是实测抓取的根证书与指纹。
开发
index.js Host 插件:配置、工具、路由、生命周期
client.js Client 卡片:设置页 UI
lib/network.js DoH 客户端、通道 fetch、证书链读取
lib/proxy.js 本地转发代理(CONNECT 隧道)
lib/certstore.js Windows 证书库扫描 / Disallowed 开关
lib/scholar-ca.js pin 的根证书与指纹
cordis.patch.yml bundle patch(插入插件行)
scripts/verify.mjs 独立自检脚本(DoH + 通道 + pin,不需要 DSH)
改完先 npm run check(等价于逐个 node --check),再重启 DSH 验证。
声明
本项目只做本地网络路径与信任管理:不绕过任何身份认证,不修改通道侧策略,不内置账号或密钥。使用前请确认所在学校已开通该通道并允许此类用法;因使用本插件产生的账号、合规或网络后果由使用者自负。
证书相关:仓库内的根证书是公开证书,从真实握手链抓取并用于 pin,不含任何私钥。
License
MIT