所有SSL专家的问题:
我们有一个嵌入式设备,上面有一个小型Web服务器,我们可以在其上安装自己的SSL自签名证书。客户端是用.NET编写的(但这并不重要)。
如何在.NET中验证设备? 将证书的指纹与数据库中的已知条目进行比较是否足够?
我的理解是指纹是整个证书的散列,包括公钥。伪装成我的设备的设备当然可以发送相同的公共证书,但它无法知道私钥,对吗?
或者我是否必须建立自己的信任链,创建自己的CA根证书,签署Web服务器证书并在客户端上安装它?
答案 0 :(得分:4)
你的建议原则上是好的。例如,它在key signing parties期间使用。在这里,参与者通常只是交换他们的公钥的名称和指纹,并确保派对上的人真正是他/她声称的人。只是验证指纹要比验证长公钥容易得多。
另一个例子是所谓的self certifying file system。这里再次只有公钥的哈希值通过安全通道进行交换。 (即,这些哈希值嵌入在URL中。)在此方案中,不必安全地发送公钥。接收方只需要检查公钥的哈希值是否与URL中嵌入的哈希值相匹配。当然,接收方还必须确保这些URL来自可信来源。
此方案和您提出的建议比使用CA简单。但是有一个缺点。您必须确保带有哈希的数据库是可信的。如果您的数据库很大,那么这将很难。如果您使用CA,则只需确保根密钥是可信的。这通常显着地简化了密钥管理,并且当然是一个原因,为什么基于CA的方案比例如更受欢迎。上面提到的自我认证文件系统。
答案 1 :(得分:3)
同样地,你不会也不应该认为两个对象是相同的,因为它们的哈希码匹配,你不应该认为证书是真实的,因为它的指纹出现在“已知证书”列表中指纹”。
碰撞是哈希算法的生活现实,甚至是好的算法,你应该防止有动机的攻击者用匹配的指纹哈希来制作流氓证书的可能性。防范这种情况的唯一方法是检查证书本身的有效性,即检查您在上一次陈述中暗示的信任链。
答案 2 :(得分:1)
<强>短强>
理论上,您可以完全按照证书颁发机构的要求为您执行操作。所以它应该没问题。
<强>长:强>
当证书颁发机构签署您的公钥/证书/证书请求时,它不会签署整个证书数据。但只是整个证书数据的计算哈希值。 这使签名变小。
当您不想建立自己的CA或使用商业/免费CA时 - 通过将指纹与您信任的指纹进行比较,您将获得第二个最值得信赖的配置。最值得信赖的解决方案是通过比较整个证书,因为它还可以保护您免受哈希冲突攻击。
正如其他人所说,你应该确保使用安全/安全的哈希算法。 SHA-1不再安全。
有关此主题的更详细信息: