我的网络包含一台 Windows PC 和数十台运行 Linux 的嵌入式 PC。客户要求 PC 与所有端点之间的通信都是安全的。
在端点我正在运行 python HTTP 服务器:
context = ssl.SSLContext(ssl.PROTOCOL_TLS_SERVER)
context.check_hostname = False
context.load_cert_chain('certificate.pem', 'private.key')
server_address= ('10.0.0.2',1443)
httpd = HTTPServer (server_address, CustomHTTP)
httpd.socket = context.wrap_socket(httpd.socket, server_side=True)
httpd.serve_forever ()
每个端点都有不同的 IP(当然)。我应该为每个端点创建不同的证书吗?
答案1
这个问题的解释非常开放。在最简单的情况下,如果它应该像网络上任何典型的 HTTPS 服务一样运行,那么有几种选择。
可能“最佳”选择是从已知 CA 获取有效的 HTTPS 证书,该 CA 的证书位于客户端的 CA 存储中。即使在私有网络中,您也可以执行此操作 - 要么购买证书并通过电子邮件进行验证,要么与公共 DNS 交互(然后您可以免费使用 LetsEncrypt)。 当然,为了实现这一点,您需要使用有效的域名(即使它指向内部 IP 地址)
另一种方法是运行您自己的 CA 并将您的 CA 密钥添加到每个客户端。这并非易事,但使用免费工具(如 easy-rsa - 我相信它与 OpenVPN 相关联,但它是一个独立的系统,可以很好地用于 HTTPS)即可轻松实现。同样,您需要某种名称解析才能使其工作。
上述 2 个解决方案假设服务器信任客户端是可行的。如果这不可行的话,那么你需要采取更进一步的措施。至少有两种方法可以做到这一点 -
使用 easy-rsa 之类的工具创建 CA,然后创建并验证客户端证书。这将需要 Web 服务器的支持。除了客户端验证服务器之外,它还会执行相反的操作。
放弃 HTTPS 的想法,而是在设备之间设置 VPN(并仅通过 VPN 连接强制连接)。这将加密所有内容,并且可能比设置 CA 更直观。您可能能够使用像 Wireguard 一样简单/轻量级的东西 - 否则 OpenVPN 也可以做到这一点。
答案2
这取决于客户的要求。
如果客户只想要免受被动监控的保护,那么无需任何验证的通用虚假证书就足够了。
如果客户想要免受被动监控和主动攻击的保护,那么每个端点都必须有自己的证书。
对于许多端点,您应该创建一个本地 CA 并使用它来颁发设备证书;这样客户端只需要一个 CAcontext.load_verify_locations("ca.crt")
就可以处理任何端点。SmallStep (step-ca) 和 Easy-RSA 是两种常用的工具。
(当然,check_hostname = False
在服务器端是可以的,但客户端不应该这样做,否则会严重削弱对主动攻击的保护。