【问题标题】:Third-Party Signed SSL Certificate for localhost or 127.0.0.1?本地主机或 127.0.0.1 的第三方签名 SSL 证书?
【发布时间】:2021-08-03 18:30:59
【问题描述】:

在不透露太多信息的情况下,我需要设置一个 Web 服务器系统,供整个 Internet 上的最终用户使用。

用例是这样的:

  • 连接到系统时,最终用户(通常)在家中位于本地防火墙后面。
  • 系统由我们托管的远程服务器组成,严格通过 https(使用 SSL)
  • 授权机制需要在远程服务器上自行创建用户帐户,成功创建帐户后,需要下载一个软件并将其安装到最终用户的计算机上。除其他外,该软件还包含一个本地网络服务器。
  • 这个“本地”网络服务器也必须只允许 https 连接到用户的浏览器。

由于分布式软件将成为每个用户计算机上的唯一 Web 服务器,我不确定如何或是否可能获得不会导致用户信任错误的第三方签名 SSL 证书通过网络浏览器连接到它。当然它可以使用自签名 SSL 证书,但其想法是避免浏览器警告,以便最终用户将隐含地“信任”来自他们自己的应用程序的数据,这些应用程序通过 SSL 运行其网络服务器。

这可能吗?

【问题讨论】:

  • 出于兴趣,为什么连接到本地服务器,只监听127.0.0.1,需要通过SSL?中间的那个人会是谁?
  • @Neil Alice 决定 Bob 的网络服务器接收到有价值的信息,因此终止了网络服务器进程并插入她自己的进程来代替它。现在 Alice 得到用户名/密码等。
  • @chacham15 Alice 从哪里获得了杀死 Web 服务器进程的 root 密码?既然她可以安装一个键盘记录器,为什么还要费心杀死网络服务器进程呢?
  • @Neil 如果远程网站尝试访问本地网站,那么如果提供混合内容被阻止,您将被阻止。
  • 另外,请注意 localhost 将在所有应用程序之间共享 cookie、localstorage 等 - 即使在不同的端口上也是如此。对于这个用例,您真正想要做的是拥有 localhost.yourthingmabob.com 并将 DNS 缓存时间设置为年而不是分钟、天或小时。

标签: ssl ssl-certificate embeddedwebserver


【解决方案1】:

也许您可以让我们成为this offering by GlobalSign(其他 CA 提供类似的服务)。简而言之,该产品让您拥有将由 GlobalSign 证书签名的 CA 证书(并为 localhost / 注册最终用户证书)。不过,成本可能很高(我相信他们会根据具体情况确定)。

【讨论】:

  • 这是否意味着我必须创建自己的 CA 才能使其正常工作?
  • @Rimer 为了避免客户端出现浏览器警告,您需要构建一个可信证书链,即部署的 Web 服务器(将在客户端运行的服务器)中使用的证书必须使用 CA 证书进行签名,反过来必须由浏览器信任或由受信任的 CA 签名。这就是 GlobalSign 和其他已知 CA 所提供的。现在您不需要创建 CA - 如果您构建了如此复杂的应用程序,将证书生成添加到您的服务器需要 15 分钟的编码。
  • 我想我的问题是,是否有可能让受信任的 CA 为将在 "127.0.0.1" 或 "localhost" 访问的服务器签署证书?
  • @Rimer 我猜不行,你必须自己成为一个受信任的CA(即从上面讨论的已知CA获得一个特殊的证书),然后颁发这样的证书并进行证书撤销管理。
  • @Rimer 想想这个有趣的难题:假设您确实获得了一个受信任的 CA 来为您的 localhost 证书签名。如果攻击者随后将他的签名证书带到受害者的计算机上会发生什么?
【解决方案2】:

我也有同样的要求。所以你必须使用 SSL 的原因是因为现在几乎每个浏览器都会在你使用 https 并尝试连接到 http 资源时出现问题,即使 http 资源位于 localhost 上,这对我来说很愚蠢。

由于 JS SOP,我们的 localhost web 服务器提供了一个 js 文件,然后 webapp 中的 JS 可以调用这个 localhost webserver。

所以我们让 local.example.com 指向 127.0.0.1 并且实际上为这个主机名购买了 SSL 证书。然后,我们将私钥发送到这个安装在用户计算机上的 Web 服务器中。是的,我们疯了。

所有这些实际上都非常有效。大约 6 个月以来,我们一直在以数百名用户的方式运行。

我们有时会遇到的唯一问题是,当用户使用代理服务器时,这无法正常工作。请求被发送到代理服务器,它尝试连接到代理服务器上的 127.0.0.1,这显然不起作用。解决方法是向代理服务器配置添加排除项,以便绕过代理服务器对 local.example.com 的请求

当用户尝试使用 Citrix 或终端服务时,它会变得有点棘手。您必须确保每个用户的 Web 服务器在不同的端口上运行,然后将端口号告知您的远程 Web 服务器,以便在服务器上生成的页面将具有正确的端口号。幸运的是,我们还没有遇到这种情况。似乎现在越来越多的人使用虚拟机而不是 Citrix。

你有没有找到更好的方法?

【讨论】:

  • 这是个好主意(DNS 记录指向 127.0.0.1)。虽然将您的密钥/证书与应用程序捆绑在一起有点不合时宜,但我认为这几乎是唯一的方法。过期怎么处理?应用是否已下载新证书?
  • 我同意,将私钥与应用程序捆绑在一起似乎很疯狂。只是不要在其他地方的真实服务器上使用此证书,这很好。我们的应用程序是一个 SAAS 应用程序,因此我们一直在为其发布更新。该应用程序使用 Java Web Start,因此它会自动更新。如今,您还可以以每年 5 美元的价格获得 SSL 证书,因此只需获得 5 年的证书,您就不必担心一段时间了。
  • 我也有同样的问题。我想知道将这个证书的私钥本质上公开是否有任何安全隐患。
  • 另外,您在哪里以 5 美元/年的价格获得 SSL 证书?
  • 请注意,这肯定会导致您的证书被当局吊销。将私钥嵌入软件被视为违反证书使用。由于这个原因,知名公司的证书被吊销:参见例如Ciso caseBlizzard case,还有关于 Spotify、GitHub、Dropbox 的报告,可能还有更多……所以这样做需要您自担风险。
【解决方案3】:

本地主机

您永远不会获得适用于 localhost 的正确 https 证书。它是strictly forbidden。因为reasons

简而言之:

  • 配置错误的设备实际上存在,在野外等待查找,然后从 /etc/hosts 解析 localhost
  • 如果路由器定义了localhost.foo.local,它可能会导致localhost 解析不正确(您之前可能见过此类错误)

您可以创建一个根证书,然后然后创建一个所谓的“自签名”证书,由您创建的根 ca 签名。您仍然会看到丑陋的警告屏幕,但它会起作用。

localhost.YOURSITE.com(指向 127.0.0.1)

代替实际的 localhost 证书,我按照 Eugene 的建议去做 - 在公共域上创建 127.0.0.1 记录。

您可以通过 https://greenlock.domains 的 Let's Encrypt 获得 localhost.YOURSITE.com 的免费 HTTPS 证书。只需选择 DNS 选项而不是 HTTP 文件上传选项

将您的 localhost.MY-SLD.MY-TLD 指向 127.0.0.1

  • 购买*.localhost.example.com 证书并为每个安装颁发秘密xyz.localhost.example.com(并将其包含在公共后缀列表中以防止对 example.com 的攻击)
  • 使用a greenlock-enabled app 直接在客户端上即时生成此类证书(通过https://letsencrypt.org)(或将它们传递给客户端)

如果您没有被包含在 PSL 中,请注意:

  • 会话、localstorage、indexeddb 等由域共享
  • 更改端口不会改变它们的共享性

做你自己的根证书

更新:对于像 greenlock 这样使用 ACME / Let's Encrypt 的东西,这不再特别相关。

这可能是一个非常糟糕的主意,因为我们不希望用户习惯于安装根 CA(我们知道turned out for Lenovo),但对于企业/克隆机器来说,这可能是一个合理的低预算选项。

【讨论】:

  • 太棒了!它将帮助我在注册自己的证书之前测试我的项目的可行性,非常感谢!
  • 请记住,localhost.daplie.com 将在所有使用它的人之间共享 cookie、localStorage、indexeddb 等,因此您最终会想要拥有自己的。
  • 我有点担心恶意方能够通过知道私钥来撤销证书,请参阅:letsencrypt.github.io/acme-spec/… 我不确定“优先密钥”是指帐户私钥还是证书的私钥(对于 localhost.daplie.com 是公开的)
  • @joonas.fi 您应该更加担心恶意方 DNS 欺骗并将您的“本地主机”流量引导到不存在的地方。这不是生产解决方案(请参阅有关为什么禁止它的链接)。此外,Greenlock (ACME / Let's Encrypt) 现在支持 dns-01 挑战,因此您可以获得自己的证书,而不会随意暴露私钥。
  • @CoolAJ86 MITM 是 DNS 查询响应欺骗的可能性是的,尽管可以通过 DNSSEC 缓解这种情况。但是 MITM 攻击只会影响一个目标受害者,而撤销 localhost.daplie.me 证书的恶意方将能够取消潜在的数百个应用程序及其所有最终用户,如果设法通过“优先密钥”撤销" 机制。
【解决方案4】:

由于您在本地主机上,您可以告诉浏览器信任您想要的任何证书。

为 localhost 创建一个自签名证书,并告诉您的浏览器信任它。

【讨论】:

  • 您可以使用另一个程序的逻辑来做到这一点,例如通过 Java 应用程序吗?在每台需要访问具有此类证书的服务器的机器上手动执行此操作会很痛苦。如果应用程序本身可以使操作系统或(任何)网络浏览器信任该证书,那可能没问题,对吧?
【解决方案5】:

provided by CoolAJ86 提供的解决方案“将您的 localhost.MY-SLD.MY-TLD 指向 127.0.0.1”工作正常,您可以在此处查看更详细的说明:
How PLEX is doing https for all its users

PS:我只是不知道这有多可持续,因为someone with a similar scenario 的密钥已被 CA 撤销,就好像密钥已被泄露一样。

【讨论】:

  • telebit.cloud 使用 Greenlock 和 Let's Encrypt 在设备上颁发证书,这样它们就不会被吊销。
猜你喜欢
  • 2018-10-02
  • 2018-06-23
  • 1970-01-01
  • 2020-10-08
  • 1970-01-01
  • 2011-11-26
  • 1970-01-01
  • 2011-01-25
相关资源
最近更新 更多