如何验证 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 实现上使用此方法(因为X509Certificateabstract 类)。

您还可以查看X509Certificate::verify(PublicKey, Provider),它采用PublicKeyProvider 实现。

【讨论】:

以上是关于如何验证 x509 证书的签名?的主要内容,如果未能解决你的问题,请参考以下文章

X509 RSA充气城堡标志数据和验证

如何使用 WCF 签署 X509 令牌

C# 如何验证 Root-CA-Cert 证书 (x509) 链?

C#如何验证Root-CA-Cert证书(x509)链?

Apache HttpClient 4.3 和 x509 客户端证书进行身份验证

使用 node.js 验证带有 CA 证书的 X509 证书