如何验证x509证书的签名?

3
我有两个X509Certificate对象x1和x2。
我想要验证x2是由x1签名的。
我认为这是通过x1的公钥和x2的签名来完成的。
具体如何实现?
我还想知道,将x2的颁发者与x1的主题逐字节比较并在它们不同的情况下显示错误是否是常见做法。
我找到了这个帖子12456079,但我搞不清楚。

1
不,自己编写x.509处理程序并不是常见做法。除非你是一个密码学专家,正在为社区审查构建安全框架,否则你不应该自己编写x.509处理程序。 - Boris the Spider
我正在使用PDFBox阅读一个带有数字签名的PDF文件,我需要验证证书链。 - zomega
我不明白那与此相关。请使用x509库来正确处理证书,切勿考虑手动验证。 - Boris the Spider
我加载了一个带有无效自签名证书(无效签名)的PDF文档。当验证内容时,PDFBox和BouncyCastle都没有抱怨。所以如果你能告诉我这个自动验证是如何工作的就太好了(我不相信有这样的验证机制 :-))。 - zomega
1个回答

4
你正在寻找证书链,这是PKI(公钥基础设施)中常见的事情。一个证书可以签署另一个证书,以表明该证书可以被信任。
简单的例子是有一个根证书,它是由自己签名的并且被信任 - 所有人都信任这个证书。接下来,你可以要求这个证书的所有者使用根证书的私钥对你的证书进行签名。因此,如果有人想要使用你的证书,他可以检查你的证书是否由根证书签名,如果他信任根证书 - 他也可以信任你。
在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是一个抽象类)。
此外,您还可以查看X509Certificate::verify(PublicKey, Provider),它接受PublicKeyProvider实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接