使用本地IP的设备的自签名证书

17

情境:

  • 我们有一个类似于WiFi路由器的设备,具有UI和API接口
  • 该设备将在我们无法控制的任何LAN上运行,就像WiFi路由器在任何房屋中运行一样。
  • 该设备不属于任何域,并通过其IP地址(即192.168.1.100)通过浏览器访问。
  • 协议应为HTTPS
  • 使用的软件是Windows上的.NET Core/Kestrel
  • 目前,在所有浏览器中都会发出警告,说明该设备具有无效证书。
  • 约束:设备必须可由任何机器(桌面/平板电脑)访问,并且不能在客户端机器上安装或配置任何内容。

问题是: 如何最好地去除警告?我们读到私有/本地IP不能有常规证书的说法。

自签名证书似乎可以工作几天,然后错误再次出现。

Local environment


不确定您的意思,但该设备将安装在任何不属于我们的网络中。就像您在家里安装WiFi路由器一样。 - Jaime
2个回答

9
无法为 IP 地址发出 SSL 证书;您必须拥有一个实际的名称,该名称创建了证书。为了获得这样的名称,您需要一个 DNS。由于您无法访问该本地网络的内部 DNS,因此您将不得不使用公共 DNS 服务器来完成此操作。
这假设该网络内的设备确实可以访问互联网。如果不能,则彻底没有机会。
如果有互联网访问权限,那么您可以简单地使公共(子)域指向您的本地 IP 地址。基本上,配置您拥有的域名的 DNS,以便在该域名或其子域之一中有一个 A 条目,指向您的本地 IP 地址,例如“192.168.1.100”。
这样,您可以将公共域传达给其他人,当他们尝试解析该域时,它们将命中 DNS,该 DNS 将提供本地 IP 地址。因此,该网络内的设备便可接入您的设备并访问它。由于它们是通过该域名进行访问的,因此针对该确切域的证书通常会被接受。
理论上,这很好用。但实际情况可能有些复杂或昂贵。服务器证书过期,因此您将不得不在设备内包含证书(安全地!),并在必要时提供某些手段来更新它。像 letsencrypt 这样的免费证书将在几周内过期,但是付款将能够为您提供更长有效期的证书。
但最终,这仍然会有些麻烦。但不是因为域名,而是因为证书 - 至少如果您想要自动信任的证书。否则,您将回到开始的地方。

1
谢谢,它可以与我们现有的通配符证书一起使用。我们在DNS中创建了A条目,并使用本地地址。它实际上是有效的。现在只为此目的购买不同的通配符证书。 - Jaime
3
根据这篇文章所述,Plex也是用这种方法实现HTTPS的:https://blog.filippo.io/how-plex-is-doing-https-for-all-its-users/ - DLight
如果我理解正确的话,没有互联网访问权限和内部DNS访问权限,就无法让本地网络内的客户端通过HTTPS访问本地网络中某个设备上监听的REST API。对吗? - franta kocourek

1
如果我理解正确,没有互联网访问权限和内部DNS访问权限,就无法让本地网络内的客户端通过HTTPS访问本地网络上某个设备上的REST API。对吗?
那是不正确的。您可以使用通配符证书(例如使用openssl生成),并通过TLS加密进行安全通信。只是签名不受信任,因此现代浏览器会显示大警告“不安全”。这是非常错误的。与纯http相比,它更安全,因为不能确定您正在与预期的服务器通信,但您正在进行安全加密通信。
在纯http中,仅监听飞过的数据包就足够了。使用https需要假装成服务器,并发出证书和正确的终点。因此,它需要更大的工作量,对于大多数本地网络中的用例来说,安全级别已足够。
生成证书
#!/bin/bash
CONFIG="
HOME            = /var/lib/cert
[ req ]
default_bits        = 4096
default_md          = sha256
distinguished_name  = req_distinguished_name
prompt              = no
x509_extensions         = v3_req
[ req_distinguished_name ]
countryName=        YourCountryCode
stateOrProvinceName=    YourState
localityName=       YourTown
organizationName=   YourCompany
organizationalUnitName= YourUnit
commonName=     *
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = digitalSignature, keyEncipherment
extendedKeyUsage = serverAuth
subjectAltName = email:whatever@localhost

"

openssl genrsa -out /var/usr/cert/name.key 4096

openssl req -x509 -new -nodes -key /var/usr/cert/name.key \
            -config <(echo "$CONFIG") -days 365 \
            -out /var/usr/cert/name.crt

将其应用于您的服务。

对于浏览器,它将显示这个丑陋的大消息。 对于连接到服务的应用程序,您通常需要设置一个标志,禁用签名检查,比如:

  • curl -k或--insecure
  • influx -ssl -unsafeSsl

(谷歌可帮助您的应用程序)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接