我可以使用我自己的证书颁发机构通过 LAN 进行 HTTPS 吗?

Can I use my own Certificate Authority for HTTPS over LAN?

我有一个服务器和几个客户端,都在不同的 docker 容器上 运行。用户可以通过在他们的浏览器中输入localhost:3000来使用客户端(其中客户端docker是运行ning)。 所有容器 运行 在同一个 LAN 上。我想使用 HTTPS。 我可以使用自己的 CA 签署 public 私钥对,然后将 CA 的 public 密钥加载到浏览器吗? 我想对 public 域使用正常流程,但在内部使用我自己的 CA。 还是我应该寻找其他解决方案?

Meta:由于您现在已经公开了 nodejs,这至少使它的话题性处于边缘。

一般来说,PKIX(在SSL/TLS包括HTTPS中使用)的工作方式是服务器必须有私钥和匹配的证书;无论您使用 public CA 还是您自己的(如您所愿),这都是一样的。服务器还应具有验证其证书所需的任何中间证书或 'chain' 证书; public CA 将 总是 需要这样的链证书,因为 CABforum 规则(编纂常见的最佳实践)禁止直接从根颁发 'subscriber' (EE) 证书,虽然你自己的 CA 取决于你——你可以选择使用或不使用中间体,尽管正如我所说,使用它们并保留根私钥 'offline' 被认为是最佳实践——在密码学中,这意味着不在与任何人通信的任何系统上,例如在本例中请求证书的服务器,从而消除了一种攻击途径 - 在 'airgapped'(未连接甚至无法连接到)的专用设备上任何网络)和一个锁定的保险库,可能带有 'tamper protection',self-destruct 的礼貌名称。作为一个已知的例子,需要严格保护与重要 CA 的根密钥一样敏感的东西,比较 Stuxnet。

客户端不需要也不应该配置 server 证书,除非你想固定;它(他们)do 需要 CA 根证书。大多数客户端,尤其是浏览器,已经内置了 many/most/all public CA 根证书,因此使用来自此类 CA 的证书不需要对客户端进行任何操作;使用您自己的 CA 的 OTOH 需要将您的 CA 证书添加到客户端。 Windows 上的 Chrome 使用 Microsoft-supplied (Windows) 商店;您可以明确地添加到此(使用 GUI 对话框,或 certutil 程序或 powershell),尽管在 domain-managed 环境(例如企业)中它也很流行 'push' CA 证书(或证书)使用邮政总局。 Firefox 使用自己的信任库,您必须将其明确添加。

在 nodejs 中,您可以配置私钥、服务器证书,如果需要,还可以配置链证书,如 documented

PS:注意你通常应该,并且对于 Chrome(和新的 Edge,实际上是 Chromium)必须,有 SubjectAlternativeName(SAN ) 服务器证书中的扩展名指定其域名或可选的 IP 地址,而不是(或不仅是)CommonName (CN) 属性,因为您会在许多过时的 and/or 不称职的说明和教程中找到在网上。 OpenSSL 命令行使执行 CommonName 变得容易,但执行 SAN 就没那么容易了;在几个堆栈上有 many 个问题。大约 2010 年后的任何 public CA 都会自动执行 SAN。