自签名 SSL 证书是否给人一种虚假的安全感?
如果您被窃听,用户将像往常一样简单地接受证书。
答案1
有趣的问题,我认为这取决于用途。由于会话已加密,您仍然受到保护,但除非您将 CA 根证书分发给用户/客户端,否则您无法判断它是否是向您提供的正确 SSL 证书。对于内部测试/开发项目,这将非常有效,您可以生成一个根 CA 证书并将其分发给您的用户(可以通过 Windows 中的组策略和 Linux/BSD 中的 openssl 命令行完成),然后使用该根证书签署您的 CSR。用户不会看到警告或任何内容,并且您知道该证书是由您的内部 CA 签名的。
对于您无法保证这一点的外部站点,如果您通过连接发送密码或其他敏感信息,我仍然认为自签名证书比没有 SSL 要好。
然而,好的一面是,有很多非常便宜的“商业”证书发行者,去吧爸爸就是其中之一。每年只需花费约 40 欧元即可获得证书。GoDaddy 甚至为开源项目网站提供免费证书。
答案2
我要表示不同意,一次是基于狭隘的技术理由,一次是基于一般理由。
狭义的技术层面是,原帖作者询问的是自签名证书,其他几个答案都提到了由私人 CA 签名的证书,这是一个略有不同的问题。但差别不大,所以这实际上只是一个顺便提一下。
主要的反对意见是,我认为只要商业签名证书的费用不菲——每年 40 美元不是对于地球上的很多人来说,这是一笔微不足道的开支——自签名证书在互联网安全中发挥着重要作用,只要认识到它们的局限性。
自签名证书就像是我known_hosts
文件中的 ssh 密钥。如果没有独立验证,它无法确保我正在与我认为的系统对话;但它能向我保证,我现在正在与之对话的系统与我上次以为自己正在与之对话时对话的系统是同一个系统。我们一直缓存 ssh 密钥,而且我从未见过系统管理员独立验证其文件中超过一小部分的公钥known_hosts
。
自签名证书(以及由一般不合法的 CA 签名的证书)比没有 SSL 要好得多,只要人们意识到,除非他们验证证书,否则他们只能确保与自己、DNS 记录另一端的服务器以及当前在线的任何中间人的通信安全。如果他们独立验证证书,那么身份验证和加密至少与公认 CA 签名的证书一样强大。
此外,那些希望将由公认 CA 签名的证书作为唯一互联网安全灵丹妙药的人可能需要认真考虑以下问题:将中国政府签署的 CA 纳入标准 Mozilla 软件包, 和Comodo 签名的欺诈性 SSL 证书。
答案3
对于外部网站,如果用户没有安装您的 CA 证书(这是最常见的情况),是的,自签名证书会给人一种虚假的安全感,因此它比无用更糟糕:
首先,如果没有预安装的 CA 证书,用户如何验证证书确实来自您,而不是来自攻击者?当然,通过匹配证书字段(CN、指纹等)——但要匹配什么呢?所以现在你需要一个侧通道来验证证书——在我见过的少数情况下,支持热线操作员(他们应该充当验证的侧通道)不知道什么那意味着;而且,操作这样的侧通道比获取受信任的 CA 签名的证书要昂贵几个数量级,因此用户必须盲目地信任你。
其次,用户收到的警报之所以可怕是有充分理由的:由于用户无法/不会验证所提供的证书,因此他们可能会安全地将数据传输到 Elbonian Haxx0r D00dz。
第三,也是最糟糕的,你正在降低用户的敏感度: “好吧,他们告诉我应该忽略那个警告https://mysite.example.com/和一个铁砧没有掉到我的头上,我的金鱼也没有死;所以,这意味着它只是另一个没有任何实际意义的警告框,所以无论何时遇到它我都可以忽略这个框 - 无论如何我都会得到那个漂亮的锁图标,这很重要。”
换句话说,保护级别与普通 HTTP 相当(除了在线嗅探:尽管数据在传输过程中是加密的,但如果没有端点验证,这是一个相当无力的功能),但感觉保护程度过高。糟糕的汽车类比:“我有 ABS,所以我现在在恶劣条件下可以更安全地驾驶”——但 ABS 只存在于汽车的销售手册中,而实际上并不存在于汽车中。
建议阅读:OWASP SSL 最佳实践
总结:通过在面向公众的网站上使用自签名证书,您将使网络变得更糟,每次只会影响一位无知的用户。
答案4
这取决于你对“安全”的定义是什么,以及安全程度如何。
例如,您的浏览器默认接受一组 CA。这意味着,您的浏览器接受此 CA 颁发的任何证书(直到它与 DNS 名称匹配)。现在,假设某个邪恶的政府拥有一个 CA,或者可以强迫 CA 为您访问的网站颁发证书。然后,进行 MITM 非常容易:他们可以代理您的连接,将他们拥有的证书发送到您的浏览器,并且您的浏览器将接受它,因为它来自“受信任”的 CA。直到它们是 DNS 透明的(这是 MITM 的基础),这都是可以的。
因此,“可接受 CA 列表”基本上是一个巨大的安全漏洞,直到其中一个 CA 与某些邪恶政府合作。拥有自己的 CA 要好得多。
当然,您可以在公司或家庭服务器中执行此操作,因为您可以将自己的 CA 证书安装到客户端中,这也是由您控制的。在公共服务器上,您无法与任何用户打交道,要求他添加例外或添加您的证书。
因此,这取决于您对“安全”的定义以及范围。如果您拥有客户端,那么自签名肯定更安全,直到您在客户端上安装您自己的 CA 的证书。
当然,你不能在公共网站上这样做,因为你并不拥有所有的客户。所以你会面临不同行为的危险,这是不安全的。