通过bouncycastle wiki 页面,我能够了解如何创建 X.509 根证书和认证请求,但我不太了解之后如何进行概念和编程。
让我们假设甲方提出了一个证书请求并从 CA 获得了他的客户端证书。B方如何验证A的证书?A需要什么样的证书?根证书?“普通”客户端证书?
如果我们假设 A 已经成功地将他的 DER 或 PEM 格式的证书发送给 B,那么验证在编程级别上是如何工作的?
任何帮助深表感谢。
最好的问候,罗伯
通过bouncycastle wiki 页面,我能够了解如何创建 X.509 根证书和认证请求,但我不太了解之后如何进行概念和编程。
让我们假设甲方提出了一个证书请求并从 CA 获得了他的客户端证书。B方如何验证A的证书?A需要什么样的证书?根证书?“普通”客户端证书?
如果我们假设 A 已经成功地将他的 DER 或 PEM 格式的证书发送给 B,那么验证在编程级别上是如何工作的?
任何帮助深表感谢。
最好的问候,罗伯
从程序员的角度来看,您需要做一些事情来验证 X.509 证书。
有了这些可用的输入,您就可以使用内置的 PKIX 支持来构建和验证证书路径。
/* Givens. */
InputStream trustStoreInput = ...
char[] password = ...
List<X509Certificate> chain = ...
Collection<X509CRL> crls = ...
/* Construct a valid path. */
KeyStore anchors = KeyStore.getInstance(KeyStore.getDefaultType());
anchors.load(trustStoreInput, password);
X509CertSelector target = new X509CertSelector();
target.setCertificate(chain.get(0));
PKIXBuilderParameters params = new PKIXBuilderParameters(anchors, target);
CertStoreParameters intermediates = new CollectionCertStoreParameters(chain)
params.addCertStore(CertStore.getInstance("Collection", intermediates));
CertStoreParameters revoked = new CollectionCertStoreParameters(crls);
params.addCertStore(CertStore.getInstance("Collection", revoked));
CertPathBuilder builder = CertPathBuilder.getInstance("PKIX");
/*
* If build() returns successfully, the certificate is valid. More details
* about the valid path can be obtained through the PKIXBuilderResult.
* If no valid path can be found, a CertPathBuilderException is thrown.
*/
PKIXBuilderResult r = (PKIXBuilderResult) builder.build(params);
需要注意的重要一点是,如果找不到路径,您将无法获得有关原因的太多信息。这可能令人沮丧,但设计就是这样。一般来说,有许多潜在的路径。如果它们都因不同的原因而失败,路径构建器将如何决定报告什么作为原因?
好的,CAs背后的想法如下:
在编程级别上,您可以通过阅读 X.509 证书并确定 CA 应该是谁来实现这一点。鉴于 CA 的指纹,您可以在数据库中找到它并验证签名。如果匹配,您就有了信任链。
这是因为,正如我所说,只有 CA 可以创建数字签名,但任何人都可以验证它。这与加密概念正好相反。您所做的是“使用私钥加密”您希望签署的数据,并验证“使用公钥解密”是否等于您拥有的数据。