通过比较证书指纹进行SSL身份验证?

15

请所有SSL专家回答以下问题:

我们有一个嵌入式设备,上面运行着一个小型的Web服务器,我们可以在其上安装自己的SSL自签名证书。客户端是用.NET编写的(但这并不太重要)。

我如何在.NET中验证设备?只需要将证书的指纹与数据库中已知条目进行比较吗?

据我所知,指纹是整个证书(包括公钥)的哈希值。伪装成我的设备的设备当然可以发送相同的公共证书,但它不可能知道私钥,对吧?

还是说,我必须建立自己的信任链,创建自己的CA根证书,签署Web服务器证书,然后在客户端上安装它?

3个回答

5
你提出的原则上是可以的。例如,在密钥签名派对期间就会使用它。在这里,参与者通常只交换他们公钥的名称和指纹,并确保聚会上的人确实是他/她所声称的人物。仅验证指纹比验证长公钥要容易得多。
另一个例子是所谓的自证明文件系统。在这里,只有公钥的哈希值通过安全通道交换。(即这些哈希值嵌入在URL中。)在这种方案中,公钥不必安全地发送。接收者只需检查公钥的哈希值是否与嵌入在URL中的哈希值匹配。当然,接收者还必须确保这些URL来自可信源。
这个方案和你提出的方案比起来更简单,但有一个缺点。你必须确保你的哈希数据库是真实的。如果你的数据库很大,那么这可能会很困难。如果你使用CA,那么你只需要确保根密钥是真实的。这通常会显著简化密钥管理,并且当然也是CA基础方案比如上面提到的自认证文件系统更受欢迎的原因之一。

在指纹验证和密钥签名派对之间绘制类比的方式非常巧妙。SHA-1哈希的抗碰撞能力在这两个事件中都起着重要作用。 - Derek W

2
以同样的方式,您不应该因为它们的哈希码匹配就认为两个对象相等,也不应该仅仅因为证书的指纹出现在“已知证书指纹”列表中就认为证书是真实的。
即使是好的哈希算法,碰撞也是无法避免的,您应该防范有动机的攻击者可能会制作一个具有匹配指纹哈希的伪造证书的可能性。唯一的防范措施是检查证书本身的有效性,即像您在最后一句话中所暗示的那样,检查信任链。

6
什么?加密哈希函数(如SHA1)的设计使得找到两个具有相同输出的输入是不可行的。因此,如果它们的哈希匹配,则可以安全地假定这些输入相等。因此,可以安全地假定一个有动机的攻击者无法构造出两个具有匹配哈希值的证书(至少在哈希未被破解的情况下)。此外,仅检查自签名证书的签名是不够的。您需要能够信任签名密钥。 - Accipitridae
4
哈希算法中的碰撞不可避免的事实。尽管有些算法是出于最好的意图设计的,但MD5已经被推翻了,而SHA-1也已经显示出了弱点。请参见http://www.crn.com/security/212700354和http://www.rsa.com/rsalabs/node.asp?id=2834。我认为最好仔细检查证书,不要仅依赖指纹。 - Chris W. Rea
7
要验证签名的有效性,你需要先对数据进行哈希,然后检查它与签名时所得到的哈希值是否相同。因此,如果你要验证数字签名,你实际上是依赖于哈希算法的碰撞抗性。 - Accipitridae
@Accipitridae:这也是我在想的。 - chris166
1
@Accipitridae:说得好。+1。我们该做什么都会被诟病,不做又不行,我想没有简单的方法来解决这些弱点。但是,正在进行工作以替换旧算法。请参见http://csrc.nist.gov/groups/ST/hash/index.html。 - Chris W. Rea

1

简短版:

理论上来说,你只需要做一个证书颁发机构为你所做的事情。所以应该没问题。

详细版:

当证书颁发机构签署您的公钥/证书/证书请求时,它并不会签署整个证书数据,而是仅签署整个证书数据的计算哈希值。这可以使签名更小。

如果您不想建立自己的CA或使用商业/免费的CA,则通过将指纹与您信任的指纹进行比较,您将获得第二可靠的配置。最可靠的解决方案是通过比较整个证书,因为这也可以保护您免受哈希碰撞攻击。

正如其他人在此处所述,您应确保使用安全的哈希算法。SHA-1已不再安全。

有关此主题的更详细信息:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接