使用自签名证书验证数字签名

时间:2011-06-25 19:45:44

标签: security digital-signature x509certificate self-signed trust

我有一个关于使用自签名证书验证数字签名的问题:

以下教程适合我: http://www.oracle.com/technetwork/articles/javase/dig-signature-api-140772.html

但是,当X.509证书是自签名的时,接收方如何信任附加到XML消息的证书数据?任何人都可以生成自签名证书并声称自己是同一个发件人。上面教程中的验证始终返回true。发件人的证书必须加载到接收者的信任库,因此接收者可以使用信任库中的任何内容来验证签名的文档。我找不到这种情况的任何参考。

2 个答案:

答案 0 :(得分:3)

您的理解是正确的 - 使用自签名证书,任何人都可以创建证书,签名验证也可以。原因是签名验证首先执行加密操作,该操作已成功完成。第二步是验证证书本身及其来源。使用CA签名证书时,将使用CA证书(直至可信CA(或已知根CA))验证证书。使用自签名证书验证是不可能的。在上面的教程中,为了简单起见,省略了证书验证的过程,因为它非常复杂并且超出了教程的范围。

答案 1 :(得分:1)

您所描述的问题通常由Public Key Infrastructures (PKI)解决。

这是用于验证HTTPS站点的证书的传统模型。它从一组受信任的证书颁发机构(CA)开始,您可以从中将CA证书导入为“受信任”。然后,通过在要验证的证书和您知道的CA证书之间建立证书路径(将证书链接到受信任的颁发者,可能通过中间CA证书),可以针对这组受信任的锚点验证您获得的实体证书。

RFC 5280中描述了执行此操作的各种规则。 PKI系统不仅适用于Web服务器,而且适用于任何实体(除了拥有有效证书之外,Web服务器还有其他规则可以验证它们是否是您要与之通信的服务器。)

(特别是因为选择要信任的CA证书通常是代表用户完成的,至少在默认情况下是由操作系统或浏览器供应商完成,这个模型并不完美,但它是最常用的。)

或者,建立一个您可以提前信任的自签名证书列表并没有错。

无论哪种方式,您都需要通过乐队之外的机制预先设置您所信任的内容(例如,通过与您信任的人会面并使用他们亲自为您提供的证书)。

由于 Issuer DN Subject DN 的概念,此PKI模型与X.509格式齐头并进。您可以拥有其他模型,例如依靠PGP证书,您可以在其中构建信任网络;你仍然需要一组初始的可信锚。

对于Java中的XML-DSig,您应该实现仅返回您信任的密钥的X509KeySelector。在一个简单的场景中,您拥有一组您信任的预定义自签名证书,您可以遍历包含这些可信证书的密钥库。否则,请使用Java PKI Programmer Guide(根据您使用的教程链接)。