DeepSeek Harness 怎么用原生 TLS 启动 dsh web?证书链、私钥与 Secure cookie
DeepSeek Harness 的 dsh web 可以自己终止 TLS:加 --tls-cert 与 --tls-key 两个参数,监听器就直接用 HTTPS 提供服务,默认端口仍是 3080。 这条路径适合单机、内网或不想再维护一层 Nginx 的场景。它的代价是证书生命周期要自己管:文件读一次、缺了不启动、换了要重启,而且浏览器信不信由浏览器自己的信任库决定。
DeepSeek Harness:什么时候值得让 dsh web 自己终止 TLS
只有“访问端能直接连到这台机器”时,原生 TLS 才划算;如果前面已经有统一入口,交给代理更合适。 可以先按访问形态分三类:(来源)
| 访问形态 | 推荐做法 | 原因 |
|---|---|---|
| 本机或同一内网直接访问 | 原生 TLS | 不用额外进程,证书和端口都在一条命令里 |
| 公网域名、多个后端、需要 WAF | 反向代理终止 TLS | 证书、访问日志、限流都集中在入口 |
| 临时演示、没有域名 | 隧道或自签证书 | 先解决可达性,再补信任链 |
原生 TLS 的边界也要提前知道:它不会帮你申请证书、不会自动续期、不会监控文件变化。它只做一件事——把指定证书和私钥装载进监听器,然后用 HTTPS 接请求。
三条常见路径可以这样取舍:
- 原生 TLS — 证书直接交给
dsh web,适合单机、内网、临时对外演示。代价:续期和文件轮换要自己安排。 - 反向代理终止 TLS — Nginx 或 Caddy 持有证书,
dsh web继续听 loopback。代价:多一层配置,但域名、WAF、日志都能集中。 - 隧道 + 自签证书 — 先解决可达性,再补信任链。代价:链路经过第三方,敏感会话要评估合规性。
三种方式都能配 --public-url,区别只在“证书归谁管、访问日志在哪看”。下面只讲第一种。
DeepSeek Harness:证书与私钥的四个硬要求
官方对文件的要求很具体:证书要带完整链,私钥要无口令,路径按进程工作目录解析,文件只在启动时读一次。 四条逐项核对:(来源)
- 证书文件放完整链 — 不只是站点证书,中间证书也要按顺序拼进去。预期:用
openssl s_client -connect 域名:3080 -showcerts能看到完整链,而不是只返回一张站点证书。 - 私钥必须是不带口令的 PEM — 带口令的私钥在启动时无法自动解密。预期:
openssl pkey -in server.key -noout不提示输入口令即可通过。 - 路径按进程工作目录解析 —
--tls-cert与--tls-key接收的是相对路径时,基准是启动dsh时所在目录,不是配置文件目录。预期:在任意目录启动前,先用绝对路径排除歧义。 - 证书必须覆盖实际访问名 — 浏览器用自己的信任库和名称校验,证书 SAN 里没有你访问的域名或 IP 就会拒绝。预期:访问地址与证书 SAN 完全一致。
这四条里任何一条不满足,表现都不是“降级成 HTTP”,而是启动直接失败。官方明确写了:文件缺失或无效时启动失败,绝不回退到 HTTP。
DeepSeek Harness:启动命令与三步验证
最小启动形态是 dsh web --tls-cert <证书> --tls-key <私钥>;对外访问时再补 --public-url 与 --trusted-host。 按下面顺序做:(来源)
dsh web \
--tls-cert /etc/dsh/fullchain.pem \
--tls-key /etc/dsh/privkey.pem \
--public-url https://dsh.example.com/ \
--trusted-host dsh.example.com
- 先只验证监听器 — 在本机执行
curl -vk https://127.0.0.1:3080/。预期:TLS 握手成功;自签证书会提示不受信任,但不应出现连接被拒。 - 再验证证书链 — 用
openssl s_client -connect 127.0.0.1:3080 -servername dsh.example.com -showcerts。预期:输出里能看到站点证书和中间证书,Verify return code为 0 或仅因本地未装根证书而失败。 - 最后验证浏览器访问 — 打开
--public-url公告的地址,完成启动令牌换 cookie。预期:地址栏是 HTTPS,登录后不再反复跳认证页。
如果第 1 步就失败,先看终端报错里是“文件不存在”“私钥无法解析”还是“证书与私钥不匹配”,不要先去改代理配置。
DeepSeek Harness:Secure cookie、public-url 与 trusted-host 的关系
TLS 只解决传输加密,不解决“这个域名是否被信任”;--public-url 只公告地址,--trusted-host 才放行 authority。 三者经常被混为一谈:(来源)
- TLS 监听器会给会话 cookie 加
Secure— 浏览器之后只会通过 HTTPS 回传它。如果前面又套了一层终止 TLS 的代理,代理到监听器这一段也要保证 cookie 不被降级。 --public-url是公告,不是授权 — 它影响打印出来的启动 URL、DSH_WEB_URL和 agent 运行时上下文里的 Web GUI URL,不会让别的 Host 通过栅栏。--trusted-host是栅栏名单 — 浏览器以未列入的 authority 访问时,每个/api调用都会得到 403,即使 TLS 完全正常。
一个常见误判是:证书配好了、页面能打开,但所有接口都 403。这时不是证书问题,而是 Host 没进信任名单。把浏览器地址栏里的 authority 原样写进 --trusted-host,再重启验证。
DeepSeek Harness:证书验证的三个命令
配好 TLS 不等于证书正确;先用三条只读命令确认链、SAN 和实际握手。 三条命令分别回答三个问题:(来源)
- 证书覆盖了哪个名字 —
openssl x509 -in fullchain.pem -noout -text | grep -A1 "Subject Alternative Name"。预期:输出里能看到你实际访问的域名或 IP;没有就是名称校验必失败。 - 链是否完整 —
openssl verify -CAfile ca.pem -untrusted intermediate.pem server.pem。预期:返回OK;只放站点证书时这里会报 unable to get issuer certificate。 - 实际握手是否成功 —
openssl s_client -connect 127.0.0.1:3080 -servername dsh.example.com -showcerts。预期:能看到站点证书与中间证书,Verify return code为 0 或仅因本地未装根证书失败。
这三条命令只验证传输层,不验证 Web 认证与 --trusted-host;握手成功但 API 403,仍然要回到信任栅栏。
DeepSeek Harness:换证书、排错与不适合的场景
换证书的动作不是“覆盖文件”,而是“覆盖后重启或重新加载监听器”;否则旧证书会一直用到进程退出。 官方说明监听器只读一次文件,不监视变化。换证书时按这个顺序:(来源)
- 先备份旧文件 — 保留旧证书和私钥,确认新文件权限正确。预期:出问题时可以立即换回。
- 校验新链与新私钥 — 分别跑
openssl verify与openssl pkey -noout。预期:两条命令都不报错,再重启。 - 重启并复验 — 重启
dsh web,重复上一节的curl与s_client。预期:新证书指纹出现在输出里。
不适合原生 TLS 的情况也很明确:需要自动续期、需要按路径分流到多个后端、需要统一 WAF 或访问日志时,把 TLS 交给反向代理。原生 TLS 更适合“就这一台、就这一个入口”的部署。
DeepSeek Harness 常见问题
Q:自签证书能不能用? 能,但访问端必须信任签发它的根证书。浏览器不会因为你在 DSH 里配了证书就自动信任,尤其手机和另一台电脑要分别安装。
Q:端口能不能换成 443?
可以,dsh web --port 443 即可;但 443 通常需要额外权限,容器里还要确认端口映射。换端口后,--public-url 和 --trusted-host 里的 authority 也要同步。
Q:TLS 配好后还需要反向代理吗? 不需要,除非你还要域名分流、WAF、统一证书管理或访问日志。原生 TLS 与代理部署是两种并列方案,不是必须叠加。
Q:为什么重启后浏览器又要重新认证? 会话 cookie 绑定 hostname 与 port。换端口、换域名或证书配置改变了访问 authority,旧 cookie 就不再匹配,需要重新用启动令牌换一次。
一句话收束: 原生 TLS 是把证书交给 dsh web 自己管,适合单入口部署;配好证书只是第一步,--trusted-host 与 Secure cookie 才是能正常用起来的关键。
常见问题
DeepSeek Harness 里,可以。dsh web 支持 --tls-cert 与 --tls-key 两个参数,由监听器自己终止 TLS,默认仍然监听 3080。证书文件要包含完整证书链,私钥必须是不带口令的 PEM;两者缺一或格式不对,进程会启动失败,不会偷偷退回 HTTP。
DeepSeek Harness 只负责把证书发出去,信任判断由浏览器自己的信任库完成。自签证书或内部 CA 签发的证书,需要先把根证书装进访问端;证书里的 SAN 还必须覆盖你实际访问的域名或 IP,否则名称校验一样会失败。
DeepSeek Harness 里,要写。DeepSeek Harness 的 --public-url 只负责对外公告访问地址,--trusted-host 才决定 /api 的信任栅栏放行哪个 authority。TLS 只保护传输,不会自动把浏览器可见的域名加入信任名单;代理或域名访问时两者仍需显式配置。
DeepSeek Harness 的监听器只在启动时读取一次证书与私钥文件,运行中不会监视文件变化。替换文件后需要重新加载监听器或重启进程;如果新文件缺失、链不完整或私钥带口令,重启会直接失败,而不是继续用旧证书。
DeepSeek Harness 里,单机或内网直接访问,选原生 TLS 最省事,一条命令即可;需要统一域名、多个后端、WAF 或团队级证书管理时,选反向代理终止 TLS。两种方式都支持 --public-url,区别是证书和访问日志由谁维护。
相关术语
- dsh web
- dsh web 是 DeepSeek Harness 启动 Web UI 的入口,等价于 dsh --profile web,默认监听 127.0.0.1:3080,可通过 --tls-cert 与 --tls-key 让监听器自身终止 TLS。— DeepSeek Harness 官方文档 - 在反向代理之后发布 Web UI
- 证书链
- 证书链是从站点证书到根证书的完整签发路径。dsh web 的 --tls-cert 文件必须包含完整链,只放站点证书会让部分客户端无法完成校验。— DeepSeek Harness 官方文档 - 在反向代理之后发布 Web UI
- Secure cookie
- Secure cookie 是只允许通过 HTTPS 回传的浏览器 cookie。dsh web 在 TLS 监听模式下会给会话 cookie 加上 Secure 属性,因此公开访问链路应保持 HTTPS。— DeepSeek Harness 官方文档 - 在反向代理之后发布 Web UI
- --trusted-host
- --trusted-host 是 dsh web 可重复使用的参数,用于把浏览器可见的 authority 加入 /api 信任栅栏;它只决定请求是否被接受,不等于对外公告地址。— DeepSeek Harness 官方文档 - 在反向代理之后发布 Web UI
来源
- DeepSeek Harness 官方文档 - 在反向代理之后发布 Web UI· deepseek-ai
- DeepSeek Harness 官方参考 - HTTP 服务器· deepseek-ai