从内部服务器发送推送通知

从内部服务器发送推送通知
  1. 背景

    我有一个用 Java 和 Spring 编写的智能家居应用程序。它在我的家庭网络 192.168.xx 内的 raspberrypi 上运行。出于安全原因,我不想通过互联网控制它。

  2. 我拥有的

    Web 应用程序由网页和一些 API 组成。我可以在手机、平板电脑或笔记本电脑上打开网页来查看状态(例如室温)并发送命令(例如开始加热)。

  3. 我想要的是

    我希望即使页面未打开,服务器也可以向我的网络客户端发送推送通知。

  4. 我尝试过

    我试图将网页设为 PWA 并从 https 站点运行,然后在本地连接到服务器。但是 PWA 的混合内容策略阻止了这一点。我试图将本地服务器设为 https。但是由于它在私有 IP 地址上运行,因此无法获取有效的 SSL 证书。

我不想编写本机应用程序,因为我需要为 android、iOS、macOs 和 windows 编写它,这是一个维护的噩梦。

那么我有什么选择?TIA。

答案1

我将开始将其作为答案发布,因为它对于评论来说太过深入......

在处理伪造证书和域名时,域名的 DNS 解析和证书有效性问题完全由您控制。只要您控制所有系统即可。

您可以将域名查找缩短到特定地址,通过修改主机文件...

主机入口

现在,您的客户端计算机将认为 service.foo.com 实际上是您的服务器的 LAN(或 wan,如果您有静态 IP 或动态 DNS 并通过路由器/防火墙进行移植)IP。在您的 Pi 中,它将位于 /etc/hosts

它不必是您拥有的或存在的域,但最好选择不存在的随机域以避免混淆。

现在客户认为域名该 IP 的确定性与在公共或私有 DNS 服务器中查找一样。打开浏览器并转到该 URL 将解析到您的服务器,如果那里有可以接受它的服务器,则会像任何其他页面一样加载。

下一个问题是证书现在必须与域报告的内容相匹配。

您可以按如下方式剪切自签名证书。

创建一个名为 req.conf 的文本文件(任意名称,但必须与下面的命令行匹配)

并将其填充为您自己的值,然后保存。

[req]
distinguished_name = req_distinguished_name
x509_extensions = v3_req
prompt = no
[req_distinguished_name]
C = US
ST = CA
L = Beverly Hills
O = MyCompany
OU = IT
CN = SERVICE.FOO.COM
[v3_req]
subjectAltName = @alt_names
[alt_names]
DNS.1 = SERVICE.FOO.COM

然后你需要使用 openssl 剪切密钥对

制作密钥对(按照提示,它们是合乎逻辑的......):

openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout cert.pem -out cert.pem -config req.conf -extensions 'v3_req'

如果需要,可以在任何地方将其转换为 PFX 格式,即 PFX 而不是 PEM 格式,不确定您的情况,但无论哪种方式,您现在都有 crt/key、PFX 和 PEM 版本,因此您已为 bear 做好了准备:

openssl pkcs12 -export -out cert.pfx -in cert.pem

验证证书详细信息是否正确:

openssl x509 -in cert.pem -noout -text

从这里,您可以根据 Web 服务器使用的任何指令在 Web 服务器上绑定密钥。您可以通过以 HTTPS 形式加载页面来验证这一点……应该抱怨证书无效,但这一步只是为了确保它正在被提供。

注意:如果您的服务器没有浏览器可访问的页面,您可以再次使用 openssl 来检查证书,如下所示:

 openssl s_client -connect service.foo.com:443

当然,如果您的端口不是 443,则可以使用它。这将连接并返回所有应与您上面看到的内容相匹配的证书详细信息。

如果一切顺利,现在你要做的就是告诉你的客户相信证书(在本地证书存储区中注册,因此它永远不会要求现实世界的公共 CA 来验证证书。)

您无需输入所有内容,这里有一套很好的说明...

视窗:https://support.kaspersky.com/Cyber​​Trace/1.0/en-US/174127.htm

Linux:https://unix.stackexchange.com/questions/90450/adding-a-self-signed-certificate-to-the-trusted-list

从那时起,整个链条从我的域名在哪里到我的域名是谁,再到我的域名是否受信任,都应该在当地权威机构上运作,而不是与现实世界的 DNS/CA 系统相关的任何事情......

这也可以通过网络中的域 DNS 服务器和域 CA 来完成,例如 Microsoft Active Directory,但如果您没有,那么对于开发实验室来说,当上述内容已经足够时,这有点小题大做。

免责声明:尽管如此,尽管这确实提供了一种解决方法,但我绝不会建议将此模型用于生产或公共用途。仅限实验室和内部/个人外部系统。它只是为了证明它可以做到,一旦所有测试和部署用于任何其他用途,您就应该遵循既定的 HTTPS 安全标准!;)

这就是为什么我将公共 DNS 和 CA 系统称为隐含信任模型,你实际上只是说我信任那个人,因为我信任这个人,而他说另一个人没问题。只有当你信任的人验证其他人是你可以信任的人时,它才有效!在这种情况下,你只是信任你自己。:-)

相关内容