具有本地IP的设备的自签名证书

时间:2018-07-04 16:33:19

标签: ssl asp.net-core x509certificate tls1.2 pfx

场景:

  • 我们有一台类似于WiFi路由器的设备,其中公开了UI和API
  • 该设备可以在我们无法控制的任何LAN上运行,就像WiFi路由器可以在任何房屋中运行一样。
  • 该设备不属于任何域,可以使用浏览器通过其IP地址(即192.168.1.100)进行访问。
  • 协议应为HTTPS
  • 使用的软件是Windows上的.net Core / Kestrel
  • 当前,我们在所有浏览器中均显示警告,告知该设备具有无效的证书。
  • 约束:该设备应可由任何计算机(台式机/平板电脑)访问,并且不能在客户端计算机上安装或配置任何东西。

问题是: 删除警告的最佳方法是什么?我们了解到,对于私有/本地IP,没有常规证书。

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

Local environment

2 个答案:

答案 0 :(得分:4)

无法为IP地址颁发SSL证书;您必须具有为其创建证书的实际名称。为了获得这样的名称,您需要一个DNS。由于您无权访问该本地网络的内部DNS,因此必须为此使用公共DNS服务器。

这假定该网络中的设备确实可以访问Internet。如果他们不这样做,那么您就完全不走运了。

如果可以访问Internet,则只需将公共(子)域指向您的本地IP地址即可。基本上,为您拥有的域配置DNS,以使该域或其子域之一上有一个A条目,指向您的本地IP地址192.168.1.100

这样,您可以将该公共域传达给其他人,并且当他们尝试解析该域时,他们将点击DNS,该DNS将提供本地IP地址。这样,该网络中的设备便可以访问您的设备并对其进行访问。由于他们随后会通过该域进行访问,因此通常会接受该确切域的证书。

理论上,这很好。实际上,这可能有点复杂或昂贵。服务器证书已过期,因此您必须将证书(安全!)包含在设备中,并且还提供了一些在证书到期时最终对其进行更新的方法。免费的证书(例如来自letencrypt的证书)将在几周内过期,但是金钱可以为您购买过期较慢的证书。

但是最终,它仍然会有些痛苦。但这不是因为域名,而是因为证书-至少在您想要自动信任的证书的情况下。否则,您将重新开始。

答案 1 :(得分:0)

<块引用>

所以如果我理解正确,没有互联网访问,没有 访问内部 DNS,没有办法允许客户端(在本地 网络)访问一个 REST api 监听“某些”设备中的 通过 HTTPS 的本地网络。对吗?

这是不对的。您可以使用通配符证书,例如生成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

(谷歌帮助你的申请)