我正在使用一个 Docker 容器,该容器每次启动时都会使用新的自签名证书托管一个网站。我可以告诉 Firefox 每次重新生成证书并访问该网站时为该证书添加一个例外,但这需要点击几次,这有点烦人。
我无法更改证书生成的行为,因此我认为可能有一种方法可以告诉 Firefox 始终信任来自此 IP(或主机名、子网等)的自签名证书,甚至可以完全禁用此主机的证书验证。我在网上找不到类似的东西,所以我来到这里。对此有什么想法吗?
答案1
做这个 :
运行 Firefox
定位至设置 > 隐私和安全
在证书下,单击“查看证书...”
在证书管理器中,单击颁发机构选项卡
单击导入按钮导入您的证书
导入证书时可能会提示您设置信任级别。如果没有,您可以通过“编辑信任”按钮手动进行设置。
重新启动 Firefox。
答案2
更简单的解决方案是配置 docker,这样容器就不需要重新创建证书了。只要容器没有主动针对它工作,这也适用于基本容器设置:
- 识别正在运行的容器内存储证书的目录或文件,例如
<cert-path-in-container>
- 在docker主机上创建持久存储,例如
mkdir -p /var/lib/my-container/cert/
- 在容器启动时,在容器中映射持久存储
docker run [...] --volume /var/lib/my-container/cert:<cert-path-in-container>
答案3
我找到了一个适合我的解决方案。它并不完美,但看起来已经足够好了,而且应该比全局禁用证书验证更安全。以下是我所做的:
- 安装
mitmproxy
- 跑步
mitmdump --mode reverse:https://<IP assigned to docker container> --set ssl_insecure=true
这样我就可以连接到 https://<host IP>:8080,它将提供网站服务,但有一个重要的区别,即 mitmproxy 使用固定的根 CA,我能信任 Firefox。现在,当我重新启动容器并重新生成证书时,这并不重要,因为 mitmproxy 会忽略上游证书错误,并且我已将 Firefox 设置为信任 mitmproxy 根 CA。
唯一剩下的问题是 mitmproxy 似乎根据容器的主机名选择最终证书的主机名,因此 Firefox 访问 <主机 IP> 与 mitmproxy 生成的证书中的主机名不匹配。每次我重新启动 mitmproxy 并重新生成最终证书时,我都必须告诉 Firefox 为不匹配添加一个例外。
我通过编辑 hosts 文件来强制 <container hostname> 解析为 <host IP>,并将 <container hostname> 添加到network.trr.excluded-domains
about:config 中的列表中,以便 Firefox 可以使用 hosts 文件中为该域指定的 IP。现在我可以连接到 https://<container hostname>:8080,并且 URI 中的主机名与证书中的主机名匹配,无论我重新启动 mitmproxy 或容器多少次,一切都很顺利。
这有点像黑客行为,但确实有效!如果有人能想到更优雅的解决方案,我仍然愿意接受。