通过bouncycastle wiki page我能够理解如何创建X.509根证书和证书请求,但我不太明白如何在此之后继续进行概念和编程。
让我们假设甲方提出证书请求并从CA获取其客户证书。某些乙方如何验证A的证书? A需要什么样的证书?根证书? “普通”客户证书?
如果我们假设A已成功将他的证书以DER或PEM格式发送给B,验证如何在编程级别上工作?
非常感谢任何帮助。
最诚挚的问候, 罗布
答案 0 :(得分:31)
从程序员的角度来看,您需要一些东西来验证X.509证书。
如果这些输入可用,您可以使用built-in PKIX support构建和验证证书路径。
/* 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);
需要注意的一件重要事情是,如果找不到路径,则无法获得有关原因的详细信息。这可能令人沮丧,但这是设计方式。一般来说,有许多潜在的途径。如果它们都因各种原因而失败,那么路径构建器将如何决定报告的原因?
答案 1 :(得分:9)
好的,CA背后的想法如下:
在程序级别,您可以通过阅读X.509证书并确定CA应该是谁来实现此目的。鉴于CA的指纹,您可以在数据库中找到它并验证签名。如果它匹配,那么你就拥有了信任链。
这是有效的,因为正如我所说,只有CA可以创建数字签名,但任何人都可以验证它。这与加密概念完全相反。您所做的是“使用私钥加密”您要签名的数据,并验证“使用公钥解密”等于您获得的数据。