java - 如何验证 x509 证书的签名?
问题描述
我有两个 X509Certificate 对象 x1 和 x2。
我想验证 x2 是否由 x1 签名。
我认为这是通过 x1 的公钥和 x2 的签名完成的。
如何准确地做到这一点?
我还想知道将 x2 的发行者与 x1 的主题逐字节进行比较是否是常见的做法,如果它们不同则显示错误。
我找到了这个12456079帖子,但我无法弄清楚。
解决方案
您正在寻找 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
目的:
验证此证书是否使用与指定公钥对应的私钥签名。
由于X509Certificate
extendsCertificate
您可以在X509Certificate
实现上使用此方法(因为X509Certificate
是一个abstract
类)。
你也可以看看X509Certificate::verify(PublicKey, Provider)
哪些采取PublicKey
和Provider
实施。
推荐阅读
- r - 在 R 中使用 tmap 放大国家
- html - 如何使我的标题更小并提升我的品牌和导航?
- mapbox - 有没有办法根据屏幕尺寸显示 Mapbox 标记
- redis - 如何像hmset一样将javascript obejct存储在cache-manager-redis-store中?
- python - Python-循环遍历Excel文件以自动提取每个工作表名称及其数据,然后将数据导出到同一输出文件中自己的工作表
- python - Python/OpenCV - 如何保持对象在视频中移动的标签以及如何获取它们之间的距离
- angular - 使用 postcss-scss 解析器重试 scss angular 12 错误
- unit-testing - XUnit 将附件保存到 TRX 记录器文件
- java - 通过传递取自用户输入的 sql 语句从 java 调用 oracle 过程
- delay - 为什么 Mininet 不丢弃任何数据包?