首页 > 解决方案 > 如何验证 x509 证书的签名?

问题描述

我有两个 X509Certificate 对象 x1 和 x2。

我想验证 x2 是否由 x1 签名。

我认为这是通过 x1 的公钥和 x2 的签名完成的。

如何准确地做到这一点?

我还想知道将 x2 的发行者与 x1 的主题逐字节进行比较是否是常见的做法,如果它们不同则显示错误。

我找到了这个12456079帖子,但我无法弄清楚。

标签: javax509certificate

解决方案


您正在寻找 PKI(公钥基础设施)中常见的证书链。一个证书可以签署另一个证书以表明该证书是可以信任的。

在简单的示例中,将有一个自签名且受信任的根证书 - 每个人都信任此证书。接下来,您可以要求此证书的所有者使用 Root 的证书私钥签署您的证书。因此,如果有人想使用您的证书,他可以检查您的证书是否由 Root 证书签名,如果他信任 Root 证书 - 他也可以信任您。

在 Java 中,您可以使用以下内容检查证书是否由相应证书的私钥签名:

X509Certificate yourCert = ...
X509Certificate root = ...

try {
    yourCert.verify(root.getPublicKey()); } 
catch (CertificateException | NoSuchAlgorithmException | InvalidKeyException | NoSuchProviderException e) {
    //handle wrong algos
} catch (SignatureException ex) {
    //signature validation error
}

服务于这个Certificate::verify目的:

验证此证书是否使用与指定公钥对应的私钥签名。

由于X509CertificateextendsCertificate您可以在X509Certificate实现上使用此方法(因为X509Certificate是一个abstract类)。

你也可以看看X509Certificate::verify(PublicKey, Provider)哪些采取PublicKeyProvider实施。


推荐阅读