Daemon HTTPS 与证书
配置 PEM 证书、浏览器安全上下文及渠道 worker 的回连信任。
默认 daemon 使用 HTTP。手机通过局域网 IP 访问时,纯 HTTP 不能提供 getUserMedia 等浏览器安全上下文能力;需要可信 HTTPS 才能使用相关语音入口。
证书与启动
准备已有的 PEM 证书和私钥,并确保使用设备信任其签发机构。示例路径必须换成实际证书:
qwen serve --hostname 0.0.0.0 \
--tls-cert /absolute/path/server.pem \
--tls-key /absolute/path/server-key.pem \
--allow-origin https://192.168.1.100:4170tls-cert 与 tls-key 必须成对,缺一个会拒绝启动。TLS 只加密传输,不取代 bearer:非 loopback 仍需配置或启动时生成的 token。daemon 不自动生成证书,也不提供 ACME/Let's Encrypt 签发。
证书 SAN 应涵盖实际浏览器地址。使用 --open 时,本机打开地址可能改为 127.0.0.1,因此只含 LAN IP 的证书会产生名称不匹配。
渠道 worker 也需要信任
渠道 worker 通过 HTTPS 回连 daemon。自签证书或包含根的完整链可由 daemon 注入 worker 的 NODE_EXTRA_CA_CERTS;由本地 CA 签发的叶证书本身不足以建立信任,需要在 daemon 启动环境提供 CA 根。
官方用 mkcert 时的环境配置为:
export NODE_EXTRA_CA_CERTS="$(mkcert -CAROOT)/rootCA.pem"该命令要求已经安装并配置 mkcert。operator 提供的 CA 与 daemon 证书合并,不被覆盖;缺少 CA 时可能表现为 daemon 正常启动,但所有渠道 worker 因 UNABLE_TO_VERIFY_LEAF_SIGNATURE 反复失败。检查启动日志的信任诊断。
IPv6 与证书轮换
:: 或 [::] 通配监听为双栈;worker 使用主机实际拥有的 loopback,存在 ::1 时用它,否则使用 127.0.0.1。证书同时包含两个 loopback,可避免环境切换后的名称不匹配。0.0.0.0 的 worker 回连仍需 127.0.0.1。
空 hostname 会在绑定前报错,不会默默解释成通配地址。原地替换证书文件后必须重启 daemon:监听器继续使用启动时读到的字节,新 worker 却可能读到新证书,导致二者信任不一致。
反向代理的 TLS、Host 和 Origin 行为还需按远程访问处理。官方早期“local-only”说明不应被解读为这些具体 TLS 参数不存在,也不能反过来当作所有公网生产部署已获保证。