您描述的问题通常由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
仅返回您信任的密钥的 a。在一个简单的场景中,您有一组预定义的您信任的自签名证书,您可以遍历包含这些受信任证书的密钥库。否则,请使用Java PKI 程序员指南(链接自您使用的教程)。