在浏览器中导入 SSL 证书无法阻止安全警告

在浏览器中导入 SSL 证书无法阻止安全警告

我有一台运行 HTTPS 服务器的嵌入式设备 (ESP32)。我通过以下方式生成证书:

openssl req -newkey rsa:2048 -nodes -keyout prvtkey.pem -x509 -days 3650 -out cacert.pem -subj "/CN=My app"

我知道这是自签名的,没有任何机构信任它。因此,当我尝试连接到服务器时,我在浏览器中收到了预期的警告,要求我接受证书。

然后我将它安装cacert.pem到我的浏览器中(在桌面和 Android 设备上尝试使用 Firefox)。证书已正确导入,但浏览器仍然显示警告。Firefox 详细说明如下:

MOZILLA_PKIX_ERROR_CA_CERT_USED_AS_END_ENTITY

我是否遗漏了什么?如果仍然要求提供安全保障,那么在浏览器中安装证书的目的是什么?

答案1

现代浏览器对 不感兴趣Subject。相反,它们需要将您在地址栏中输入的 URL 与subjectAlternativeName(SAN) 扩展名进行匹配。通常是 DNS 名称或 IP 地址。

因此,您需要确保您的证书具有适当的 SAN 条目。

您还应确保basicConstraint扩展名缺失,或者如果包含则设置为CA:False

这仅在您有固定名称时才有意义。如果您没有固定名称,则无法对其进行认证。证书将公钥绑定到已知身份 - 通常是名称或 IP 地址。这类似于人类拥有护照或其他形式的身份证件的方式。如果您无法验证此人的姓名,则无法颁发护照或身份证件。同样,如果您无法验证主机名或 IP,则无法颁发 X.509 证书。标准 (RFC 5280) 中有一些 DNS/IP 的替代方案,但我怀疑它们在这里不会有帮助。基本上,如果您不知道自己在认证什么,您就无法对其进行认证!

商业 CA 会更加严格,因为您绑定到公钥的名称必须可从公共互联网验证。这通常意味着公共 DNS 名称。也就是说,虽然您可以在私有命名空间(例如<hostname>.fritz.box<hostname>.mark.test)内自签名证书,但公共 CA 将无法验证这些名称,因此不会用它们颁发证书。

相关内容