如何验证 x509 证书的签名?
Posted
技术标签:
【中文标题】如何验证 x509 证书的签名?【英文标题】:How to verify the signature of a x509 certificate? 【发布时间】:2019-09-27 13:10:20 【问题描述】:我有两个 X509Certificate 对象 x1 和 x2。
我想验证 x2 是否由 x1 签名。
我认为这是通过 x1 的公钥和 x2 的签名完成的。
具体怎么做?
我还想知道将 x2 的发行者与 x1 的主题逐字节进行比较是否常见做法,如果它们不同则显示错误。
我找到了这个12456079 帖子,但我想不通。
【问题讨论】:
没有。滚动您自己的 x.509 处理并不常见。除非您是为社区审查构建安全框架的密码学专家,否则您不应该推出自己的 x.509 处理。 我正在使用 PDFBox 读取签名的 PDF 文件,我需要验证证书链。 我不明白这有什么关系。使用 x509 库正确处理证书,甚至不考虑进行手动验证。 我加载了一个带有无效自签名证书(无效签名)的 pdf 文档。 PDFBox 和 BouncyCastle 在验证内容时都没有抱怨。因此,如果您能告诉我这种自动验证是如何工作的,那就太好了(我不相信有一个 :-)。 【参考方案1】:您正在寻找在 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
扩展了Certificate
,您可以在X509Certificate
实现上使用此方法(因为X509Certificate
是abstract
类)。
您还可以查看X509Certificate::verify(PublicKey, Provider)
,它采用PublicKey
和Provider
实现。
【讨论】:
以上是关于如何验证 x509 证书的签名?的主要内容,如果未能解决你的问题,请参考以下文章
C# 如何验证 Root-CA-Cert 证书 (x509) 链?