2009-07-06 166 views
14

所有SSL专家的问题:通过比较证书指纹进行SSL身份验证?

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

如何在.NET中验证设备?是否足够比较指纹的证书与数据库中的已知条目

我的理解是指纹是整个证书的散列,包括公钥。伪装成我的设备的设备当然可以发送相同的公共证书,但它不知道私钥,对吗?

或者我是否必须建立自己的信任链,创建自己的CA根证书,签署Web服务器证书并将其安装在客户端上?

回答

4

你的建议原则上没问题。例如在key signing parties期间使用。在这里参与者通常只是交换他们的公钥的名字和指纹,并确保参加聚会的人确实是他/她所声称的人。验证指纹比验证长公钥要容易得多。

另一个例子是所谓的self certifying file system。这里再次只有公钥的哈希通过安全通道进行交换。 (即,这些散列嵌入在URL中)。在这种方案中,公钥不必安全地发送。接收者只需检查公钥的哈希值是否与嵌入在URL中的哈希匹配。当然,接收器还必须确保这些URL来自可信来源。

这个方案和你的建议比使用CA更简单。但有一个缺点。你必须确保你的数据库使用散列是真实的。如果你的数据库很大,那么这将很困难。如果您使用CA,那么您只需确保根密钥是真实的。这通常显着简化了密钥管理,当然也是一个原因,为什么基于CA的方案比例如上面提到的自我认证文件系统。

3

以同样的方式,您不应该也不应该认为两个对象因为它们的哈希码匹配而相等,您不应该认为证书是真实的,仅仅因为它的指纹出现在“已知证书指纹“。

碰撞是一种散列算法,即使是好的算法也是生活中的一个现实,你应该防范动机的攻击者可能用匹配的指纹哈希制作一个流氓证书的可能性。防止出现这种情况的唯一方法是检查证书本身的有效性,即检查信任链,就像您在上次声明中所暗示的那样。

+5

咦?加密散列函数(如SHA1)的设计使得找到两个散列到相同输出的输入是不可行的。因此,如果他们的散列匹配,那么假设输入相等是安全的。因此,假设有动机的攻击者不能制作具有匹配散列的两个证书(至少只要散列未被破坏)也是安全的。 此外,仅仅检查自签名证书的签名是不够的。您需要能够信任签名密钥。 – Accipitridae 2009-07-09 06:35:40

+4

碰撞*是散列算法的一个生活事实。尽管这些算法中的一些已经以最好的意图进行设计,但MD5已经被废,了,并且SHA-1也被证明也有弱点。 请参阅http://www.crn.com/security/212700354和http://www.rsa.com/rsalabs/node.asp?id=2834。我认为最好彻底检查一下证书,而不要仅仅依靠指纹。 – 2009-07-09 11:38:40

1

简称:

那么在理论上你那么做的正是一个证书颁发机构为你做。所以它应该没问题。

长:

当证书颁发机构签署您的公钥/证书/证书请求时,它不签字整个证书数据。但只是整个证书数据的计算哈希值。 这使签名保持较小。

如果您不想建立自己的CA或使用商业/免费的 - 通过比较指纹和您信任的指纹,您将获得第二个最值得信赖的配置。最值得信赖的解决方案是通过比较整个证书,因为它还可以保护您免受散列冲突攻击。

至于其他人说在这里你应该确保使用安全/安全散列算法。 SHA-1不再安全。

更详细的信息到这个话题:

相关问题