繁体   English   中英

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

[英]Validate digital signature with a self-signed certificate

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

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

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

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

您描述的问题通常由公钥基础结构(PKI)解决

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

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

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

或者,建立您可以提前信任的自签名证书列表没有任何问题。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM