1

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

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

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

4

2 回答 2

3

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

于 2011-06-25T20:19:19.397 回答
1

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

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

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

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

或者,预先建立一个您会信任的自签名证书列表并没有错。

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

由于Issuer DNSubject DN的概念,此 PKI 模型与 X.509 格式密切相关。您可以有其他模型,例如依赖 PGP 证书,您可以在其中建立信任网络;您仍然需要一组初始的受信任锚点。

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

于 2011-06-25T20:17:25.107 回答