我有两个X509证书对象x1和x2。
我想验证x2是否已由x1签名。
我认为这是通过x1的公钥和x2的签名完成的。
如何精确执行此操作?
我还想知道是否通常将x2的发行方与x1的主题逐字节进行比较,如果它们不同则显示错误。
我找到了此12456079帖子,但我不知道。
您正在寻找证书链,这在PKI(公钥基础结构)中很常见。一个证书可以签署另一个证书,以表明该证书可以信任。
在简单的示例中,将有一个自签名且受信任的根证书-每个人都信任此证书。接下来,您可以要求该证书的所有者使用Root的证书私钥对您的证书进行签名。因此,如果某人想要使用您的证书,他可以检查您的证书是否已由Root证书签名,并且如果他信任Root证书-他也可以信任您。
在Java中,您可以使用类似的方法检查证书是否由相应证书的私钥签名:
X509Certificate yourCert = ...
X509Certificate root = new ...
try {
yourCert.verify(root.getPublicKey()); }
catch (CertificateException | NoSuchAlgorithmException | InvalidKeyException | NoSuchProviderException e) {
//handle wrong algos
} catch (SignatureException ex) {
//signature validation error
}
Certificate::verify
用于此目的:
验证此证书已使用与指定的公钥相对应的私钥签名。