本地 IP 地址的 HTTPS

Har*_*a R 7 dns rest ssl web-applications

我有一个小工具[*],它连接到用户的 WiFi 网络并通过简单的 REST 接口响应命令。用户使用 Web 应用程序来控制此小工具。Web 应用程序当前提供服务http,应用程序的 javascript 对小工具的本地 IP 地址执行 AJAX 调用以控制它。这个方案运行良好,我没有问题。

[*] 我所说的“小工具”是指用户购买并安装在家中的实际物理物联网设备,并配置为连接到他们的家庭 WiFi 网络

现在,我想通过https. 我https在主机端设置没有问题。问题是,现在浏览器阻止了对小工具的访问(因为小工具的 REST API 已经结束http而不是https)。

显而易见的解决方案是让小工具通过https. 但是如何?它有一个本地 IP 地址,没有人会为其颁发证书。(即使他们这样做了,我也必须为每个可能的本地 IP 地址购买大量证书。)我可以通过云往返(通过在我的服务器端添加额外的逻辑来接受来自 Web 应用程序的命令并转发它通过另一个连接连接到小工具),但这会增加延迟。

有没有办法解决这个问题?我想到的一种可能性是:

  1. 获取通配符证书(例如,*.mydomain.com
  2. 运行我自己的 DNS,按照模式将子域映射到本地 IP 地址(例如,192-168-1-123.mydomain.com将映射到192.168.1.123
  3. 在所有小工具中使用通配符证书
  4. 然后,我的 Web 应用程序可以进行 AJAX 调用,https://192-168-1-123.mydomain.comhttp://192.168.1.123除了初始 DNS 查找之外,延迟将保持不受影响

这行得通吗?这是一项昂贵的试验(通配符证书的成本约为 200 美元)并且运行 DNS 服务器似乎需要大量工作。另外,我发现自己没有资格考虑安全隐患。

也许已经有一项服务可以解决这个问题?

Dan*_*hat 6

虽然这是一个相当老的问题,但今天仍然找不到现成的解决方案。

正如 @Jaffa-the-cake 在评论中发布的那样,您可以了解 Plex 是如何做到的,Filippo Valsorda 在他的博客中对此进行了解释:https: //blog.filippo.io/how-plex-is-doing-https-对于所有用户/

这与您自己提出的非常相似。您甚至不需要通配符证书,但您可以使用 Let's Encrypt 即时生成证书。(如果需要,您仍然可以使用通配符证书,Let's Encrypt 现在也支持该证书。)

就在昨天,我对该工作流程进行了手动概念验证,可以通过以下步骤实现自动化:

  • 编写一个 Web 服务,可以动态地为各个设备创建 DNS 条目,并通过 Let's Encrypt 生成匹配的证书 - 使用 certbot 和 Google Cloud DNS 等,这非常容易。我想 Azure、AWS 和其他公司也有类似的产品。当您使用 certbot 的 DNS 插件时,您甚至不需要在端口 80/443 上运行实际的 Web 服务器。
  • 在您的本地设备上,联系该 Web 服务以生成该域的唯一 DNS 条目(例如 ..yourdns.com)和证书
  • 在本地 HTTPS 服务器中使用该证书
  • 浏览到该域而不是您的本地 IP

现在,您将使用本地 IP 和公共解析的 DNS 条目与本地服务器建立 HTTPS 连接。

缺点是这不能从任意客户端离线工作。您需要考虑一个良好的安全概念,在请求 DNS 和证书的客户端与生成这些证书的 Web 服务之间建立信任。

顺便说一句,您介意分享一下您正在构建的是什么样的小工具吗?


小智 1

如果您只想通过 Web 浏览器访问设备 API,一个简单的解决方案是通过 Web 服务器代理对设备的所有请求。这甚至是设备的自签名证书也不会成为问题。唯一的问题是服务器必须与您的设备位于同一网络上。

如果不在同一网络上,您可以编写一个简单的浏览器插件(chrome)来将api请求发送到IoT设备。但这样对应用程序/插件的依赖就会很笨拙。