如何验证 x509 证书的签名?
How to verify the signature of a x509 certificate?
我有两个 X509Certificate 对象 x1 和 x2。
我想验证 x2 是否由 x1 签名。
我认为这是通过 x1 的 public 密钥和 x2 的签名完成的。
具体怎么做?
我也想知道逐字节比较 x2 的发行者和 x1 的主题是否是常见的做法,如果它们不同则显示错误。
我找到了这个 12456079 post 但我想不通。
您正在寻找 PKI 中常见的证书链(Public 密钥基础设施)。一个证书可以签署另一个证书以表明该证书是可信的。
在简单的示例中,将有一个自签名且受信任的根证书 - 每个人都信任此证书。接下来,您可以要求该证书的所有者使用 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
就是为了这个目的:
Verifies that this certificate was signed using the private key that corresponds to the specified public key.
由于 X509Certificate
扩展了 Certificate
,您可以在 X509Certificate
实现上使用此方法(因为 X509Certificate
是 abstract
class)。
您还可以查看 X509Certificate::verify(PublicKey, Provider)
,它需要 PublicKey
和 Provider
实现。
我有两个 X509Certificate 对象 x1 和 x2。
我想验证 x2 是否由 x1 签名。
我认为这是通过 x1 的 public 密钥和 x2 的签名完成的。
具体怎么做?
我也想知道逐字节比较 x2 的发行者和 x1 的主题是否是常见的做法,如果它们不同则显示错误。
我找到了这个 12456079 post 但我想不通。
您正在寻找 PKI 中常见的证书链(Public 密钥基础设施)。一个证书可以签署另一个证书以表明该证书是可信的。
在简单的示例中,将有一个自签名且受信任的根证书 - 每个人都信任此证书。接下来,您可以要求该证书的所有者使用 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
就是为了这个目的:
Verifies that this certificate was signed using the private key that corresponds to the specified public key.
由于 X509Certificate
扩展了 Certificate
,您可以在 X509Certificate
实现上使用此方法(因为 X509Certificate
是 abstract
class)。
您还可以查看 X509Certificate::verify(PublicKey, Provider)
,它需要 PublicKey
和 Provider
实现。