给 ComfyUI 开 HTTPS:自签证书、`--tls-keyfile` 与它管不到的那些事
局域网里想让另一台机器打开 ComfyUI,浏览器地址栏那个「不安全」的标记看久了总会让人想动手把 HTTPS 开起来。ComfyUI 确实内置了 TLS 开关,开起来也就两个参数的事,但它周围有几个坑挺反直觉:参数少给一个不报你想要的错、证书路径按什么目录解析、以及最关键的——官方自己在 README 里给这条路径打了一个明确的限制标签。这篇按官方 README 与 comfy/cli_args.py(v0.31.0,核对日 2026-08-09)的口径把整条链路走一遍。
一、先把两个参数的关系说清楚
在 v0.31.0 的 comfy/cli_args.py 里,跟 TLS 相关的只有两个参数:
| 参数 | help 原意 |
|---|---|
--tls-keyfile | TLS(SSL) key 文件路径。启用 TLS,使应用走 https://,需要同时给 --tls-certfile 才生效 |
--tls-certfile | TLS(SSL) 证书路径,需要同时给 --tls-keyfile |
两条 help 互相点名对方,这不是文档写重复了,而是在强调:这两个参数是一对,缺一个就不生效。这是本篇最值得先记住的一句。很多人第一次配的时候只加了 --tls-certfile,然后对着还是 http:// 的地址纳闷半天。
顺带说清楚它和监听地址的关系:--listen 默认是 127.0.0.1,也就是只听本机;不带参数直接写 --listen 时等于 0.0.0.0,::,即监听所有 IPv4 与 IPv6 网卡(同样出自 v0.31.0 的 cli_args.py)。所以「开 HTTPS」和「让别的机器能访问」是两件独立的事,前者管传输通道,后者管暴露面。真正把服务放到别人能摸到的网段上,靠的是 --listen 那一步,这一步的安全含义比 TLS 本身更需要你想清楚。
二、证书怎么生成:命令原样在这里
ComfyUI 官方 README 给出的自签证书生成命令如下,原样照抄,不要自己改写:
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem -sha256 -days 3650 -nodes -subj "/C=XX/ST=StateName/L=CityName/O=CompanyName/OU=CompanySectionName/CN=CommonNameOrHostname"
按 openssl 的通用语义,这条命令里几个选项各自的位置是这样的:req -x509 表示直接签出一张自签的证书而不是签发请求;-newkey rsa:4096 表示顺手新建一把 4096 位 RSA 私钥;-keyout key.pem 与 -out cert.pem 分别决定私钥和证书落到哪两个文件——这两个文件名后面要原样交给 ComfyUI 的两个参数;-sha256 指定签名摘要算法;-days 3650 是有效期天数;-nodes 表示私钥不加口令保存,也就省掉了启动服务时还要有人输入私钥口令这一环;-subj "..." 把主题字段一次性写在命令行里,省掉交互式问答。
-subj 里那串 StateName、CompanyName 是 README 给的占位样例,你可以改成自己的信息,CN 通常填你要访问的主机名。但要清楚一点:改这些字段不会让证书变得更被信任,自签就是自签。
生成完,当前目录下会多出 key.pem 与 cert.pem 两个文件。这就是这一步全部的产出物——README 没有描述任何额外的输出文件,我们也不去猜。
三、Windows 上没有 openssl 怎么办
README 专门为 Windows 用户补了两条途径:可以用 alexisrolland/docker-openssl 这个容器镜像来执行上面那条命令,也可以装第三方的 OpenSSL 二进制发行版。
容器这条路有个细节 README 特意点了出来:-v 挂载可以用相对路径,例如写成 ... -v ".\:/openssl-certs" ...,这样生成的 key 与 cert 会落到你当前所在的目录。这个提示的价值在于,你不用为了跑一条生成命令去拼一串绝对路径,在 <你的 ComfyUI 目录> 下直接开终端、把当前目录挂进去,出来的两个文件正好躺在你要用的地方。
需要注意 README 只给了「可以用这个镜像 / 可以用第三方二进制」这个层面的信息,具体的完整 docker run 命令行并不在官方那段文字里,所以本文不替它拼一条出来。你按该镜像自己的文档来跑,把 -v 的相对路径写法记住即可。
四、启动命令怎么写
生成好证书之后,启用方式是把两个文件路径交给那对参数:
python main.py --tls-keyfile key.pem --tls-certfile cert.pem
之后按 README 的说法,应用就走 https:// 了。
如果你同时还要让局域网内其它机器访问,再叠上监听相关的参数。下面这条是把 TLS 与监听、端口组合到一起的写法:
python main.py --listen --port 8188 --tls-keyfile key.pem --tls-certfile cert.pem
这里 --listen 不带参数,按 help 的语义等于监听所有 IPv4 与 IPv6 网卡;--port 的默认值本来就是 8188,显式写出来只是为了让这条命令自解释,你换端口时改这一处即可。以上为按官方参数语义组合的示例,未逐项实测,以官方文档与 --help 输出为准。
关于证书路径还有一句要提醒:key.pem 和 cert.pem 这种写法是相对路径,相对的是你启动进程时所在的工作目录,不是 ComfyUI 的安装目录。用桌面快捷方式、任务计划、或者 systemd 之类的方式拉起服务时,工作目录经常和你手敲命令时不一样,这时候写绝对路径更省事。
五、怎么验收
按顺序检查这几处,出问题基本都卡在其中之一:
- 两个文件都在。
key.pem与cert.pem是否真的生成在了你以为的目录里——尤其是走容器生成时,挂载点没写对的话文件会留在容器里,宿主机这边什么都没有。 - 两个参数都给了。只给一条不会启用 TLS,这是 help 里写死的成对要求。启动命令回头数一遍参数个数,比事后猜半天快。
- 访问时协议前缀要改。启用后按 README 的说法应用走
https://,你还照着老习惯敲http://,多半是打不开的。这一步最容易在「我明明配好了却连不上」的抱怨里出现。 - 浏览器会对自签证书给出警告——这属于 TLS 的通用行为,不是 ComfyUI 的特性:自签证书不在系统或浏览器的受信任根列表里,所以会看到证书不受信任一类的提示。看到这个提示恰恰说明 TLS 通道本身已经起来了。
- 换机器访问不通时,先把问题拆开。分不清是 TLS 没起来还是根本没监听到那张网卡的时候,先把 TLS 两个参数去掉、只留
--listen试一次,能用http://从另一台机器打开,就说明监听这一层没问题,问题在证书侧;反过来则是暴露面配置的问题。
需要说明的是,官方 README 与 cli_args.py 都没有给出启用 TLS 后启动日志会打印哪几行的文本,所以本文不描述具体日志行,你以自己终端里的实际输出为准。
六、什么情况不该这么干
这一节比前面所有配置步骤都重要。
README 对这条自签路径写了明确的限制:not appropriate for shared/production use(不适合共享或生产使用)。 这句话是官方原文,不是我在这里加的谨慎措辞。也就是说,上面整套做法的定位是「你自己在可控网络里给自己的实例加个传输加密」,不是「把 ComfyUI 放上生产」的方案。
再补几条边界:
- TLS 不等于鉴权。 加密解决的是链路上有人偷看的问题,不解决「谁都能打开这个页面就能提交任务」的问题。用户名密码认证在官方仓库里仍是一个 open 的 feature request(issue #987,创建于 2023-07-27,标签为 Feature,截至 2026-08-09 仍为 open);同时 v0.23.0 也确实新增过 OAuth 2.1 与 RFC 7591 DCR 相关的 endpoints(PR #14026)。这两件事不冲突,但都不足以让人下「鉴权已经齐了」的结论。所以别因为地址栏出现了小锁就默认这台实例可以随便放开。
- 版本本身是更前置的一环。 官方 Security Advisories 里有四个于 2026-07-15 发布、严重等级均为 high 的条目:
GHSA-rj8c-c4p8-3c5h(/view端点经 SVG 上传导致的存储型 XSS)、GHSA-53g8-45wq-pcv8(/userdata/{file}缺少 Content-Type 消毒导致的存储型 XSS)、GHSA-rvxv-29p8-pxgq(LoadImage 经/promptAPI 的路径穿越)、GHSA-pj59-g5vv-74q4(/experiment/models/preview的路径穿越导致任意图片文件读取),修复版本均为 0.28.0。跑在 0.28.0 之前的版本上,先升级再谈开不开 HTTPS,顺序别搞反。 - 开了 TLS 不代表配置就安全了。 官方给的是一组开关,不是一个结论。跟暴露面直接相关的其它开关还有
--enable-cors-header(不带参数时为*,即允许所有来源)、--max-upload-size(默认 100 MB),以及自定义节点侧的--disable-all-custom-nodes、--whitelist-custom-nodes、--disable-api-nodes(后者按 help 的说法不加载 api 节点,同时阻止前端与互联网通信)。要不要开、开哪几个,得看你的实际暴露程度。
七、真要进生产,方向是什么
下面这段属于通用运维做法,不是 ComfyUI 官方文档的内容,官方对生产部署没有给出对应方案,所以这里只给方向、不给具体配置:常见做法是不让应用进程直接面向不可信网络,而是由前面的反向代理终止 TLS、使用受信任 CA 签发的证书,鉴权与访问控制放在代理层或更外围的网络边界上完成,应用自身仍然只监听本机。这几件事怎么落地取决于你的基础设施,请以你所用组件的官方文档为准,不要把它当成 ComfyUI 官方推荐。
回到本篇的落点:--tls-keyfile 与 --tls-certfile 这对参数解决的是「我在自己可控的网络里,不想让流量明文跑」这一个具体问题。它做到的就是这么多,README 也没打算让它做更多。
延伸阅读
- 把 ComfyUI 部署到服务器上:
--listen、目录参数与日志落盘的完整启动命令 - 把 ComfyUI 放到公网前要想清楚的事
- 别的机器打不开 ComfyUI 页面:先看
--listen而不是查网络
本文依据 ComfyUI 官方仓库(github.com/Comfy-Org/ComfyUI)的 README、comfy/cli_args.py、
release notes 与官方安全公告整理,核对日 2026-08-09,对应版本 v0.31.0;
文中引用的 issue 状态为该日期的快照。本文内容为官方文档与源码口径,非本机实测。
参数、默认值与功能随版本变动,请以官方文档与 python main.py --help 的实际输出为准。
安全公告信息来自 GitHub Security Advisories,本文不含漏洞利用细节。