背景
我有一个用 Java 和 Spring 编写的智能家居应用程序。它在我的家庭网络 192.168.xx 内的 raspberrypi 上运行。出于安全原因,我不想通过互联网控制它。
我拥有的
Web 应用程序由网页和一些 API 组成。我可以在手机、平板电脑或笔记本电脑上打开网页来查看状态(例如室温)并发送命令(例如开始加热)。
我想要的是
我希望即使页面未打开,服务器也可以向我的网络客户端发送推送通知。
我尝试过
我试图将网页设为 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/CyberTrace/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 系统称为隐含信任模型,你实际上只是说我信任那个人,因为我信任这个人,而他说另一个人没问题。只有当你信任的人验证其他人是你可以信任的人时,它才有效!在这种情况下,你只是信任你自己。:-)