使用自签名证书加密本地 HTTP 流量

信息安全 tls 证书 x.509
2021-08-10 13:21:25

在过去的几个小时里,我一直在尝试创建一个自签名证书,我想用它来加密计算机和家庭网络上的服务器之间的 HTTP 流量(因为我很偏执)。但是,我不确定我这样做是否正确,因为我的网络浏览器中不断收到安全警告。尤其是谷歌浏览器不喜欢我正在做的事情。

希望有经验的大侠可以指导一下。

我的服务器(Synology DiskStation)可以在内部(通过其本地 IP 地址或主机名)或通过 Internet(通过公共 IP 地址或 DNS 名称)访问。不幸的是,公共 IP 地址是动态的。但是,在我的服务器上运行的服务每 60 分钟更新一次 DNS 条目。

我所做的是使用 OpenSSL 生成自签名 X.509 证书(大部分使用默认设置)。我没有指定 CN(通用名称),因为在之前的测试中我发现它在内部访问服务器时会引起更多的安全警告。相反,我在subjectAltName扩展字段中包含了 DNS 名称、主机名和本地 IP 地址。

我的服务器证书现在看起来像这样:https ://dl.dropbox.com/u/14454764/cert.crt

然后我继续在我的 Windows 机器上的受信任的根证书颁发机构证书存储中安装此证书。我现在可以使用 HTTPS 访问网络服务器,但并非没有警告。

错误包括:

  • (谷歌浏览器)Server's certificate does not match the URL.(使用主机名时)
  • (谷歌浏览器)The identity of this website has not been verified.(使用本地 IP 时)
  • (Internet Explorer) The security certificate presented by this website was issued for a different website's address.(使用本地 IP 时)

每当我重新启动浏览器时,这些警告都会返回。如果我从互联网访问网络服务器(使用 DNS 名称),我的浏览器都没有抱怨,一切都很好。

我可以生成不会触发此类错误的内部使用证书吗?非常感谢您的帮助。

1个回答

在对服务器进行 SSL 访问时,客户端执行以下验证:

  1. 客户端根据嵌入在客户端(浏览器或操作系统)中的本地“信任锚”(也称为“根 CA”)验证证书。验证是关于构建从信任锚到 SSL 服务器证书的证书链,每个证书签署下一个。算法的细节有点复杂(RFC 5280的第 6 节)。

  2. 客户端验证目标服务器的名称是否出现在服务器的证书中(验证告诉他它是某个服务器的有效证书;此步骤是关于检查它是否是正确的服务器,而不是任何其他服务器)。此步骤在RFC 2818中进行了描述。

第一步,您需要告诉您的客户端系统它应该接受自签名证书为有效。既然你说的是 Internet Explorer,我就推断出一个 Windows 操作系统;请参阅此答案以了解如何执行此操作(由于 Chrome 还使用操作系统信任库,它很可能也会为 Chrome 修复它)。

对于第二步,您必须使用带有服务器名称(不是 IP 地址)的 URL,该名称与证书扩展中dNSName出现的类型名称相匹配(当该扩展中没有,或者完全缺少扩展时,在字段中使用)如果 URL 如下所示:Subject Alt NamedNSNameCommon NamesubjectDN

https://www.example.com/path/to/whatever.html

然后浏览器将尝试www.example.com在证书中查找。如果它没有找到它,那么根据您的经验,您应该收到一个可怕的警告。

您可能需要稍微调整一下 DNS 设置,以便无论您在哪个网络位置都可以使用相同的名称。请记住,这是一个名称匹配:它不适用于 IP 地址。另外,请注意,您可以在扩展中放置多个类型名称,这对于以多个名称联系的 SSL 服务器很有用。dNSNameSubject Alt Name