java - 如何验证x509证书的签名?

标签 java x509certificate

我有两个 X509Certificate 对象 x1 和 x2。

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

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

具体如何做到这一点?

我还想知道将 x2 的发行者与 x1 的主题进行逐字节比较并在不同时显示错误是否是常见做法。

我找到了这篇 12456079 帖子,但我不明白。

最佳答案

您正在寻找证书链,这是 PKI(公钥基础设施)中常见的东西。一个证书可以对另一个证书进行签名,以表明该证书是可信的。

在简单的示例中,将有一个自签名且受信任的根证书 - 每个人都信任该证书。接下来,您可以要求该证书的所有者使用 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 达到这个目的:

Verifies that this certificate was signed using the private key that corresponds to the specified public key.

X509Certificate延伸Certificate您可以在 X509Certificate 上使用此方法实现(因为 X509Certificate 是一个 abstract 类)。

您也可以看看 X509Certificate::verify(PublicKey, Provider) 这需要 PublicKeyProvider实现。

关于java - 如何验证x509证书的签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58135268/

相关文章:

java - 如何保存首选项页面的字符串字段编辑器的输入值?

使用通配符证书的 WCF 服务给出了 DNS 身份错误

java - 从 Android 中的 x.509 证书中获取 CA 详细信息

ssl - 在 MySQL 数据库中存储 X509 证书

java - 将友谊保存在数据库中。社交网络服务

java - 使用 gradle-Tomcat-Plugin 时如何为嵌入式 Tomcat 实例提供自定义类加载器

java - 需要一些影片来了解如何使用 MySQL?

java - 被测产品没有有效的网站证书? (使用 HTMLUnit/Java)

ssl - 通过 SSL、证书等的 HttpWebRequest

java - 任何自动化 Eclipse 工作区设置的方法?