假设有一个外部CA。假设有一个URL和其他配置参数。 在运行时,我获得了需要使用CA进行验证的证书链。
因此,必须以某种方式在CA中注册链的根证书。此外,CA处理CRL,并且链中的某些证书可能会被吊销。
我有这样的代码
CertificateFactory cf = CertificateFactory.getInstance(certificateType);
List<Certificate> certx = //list of certificates obtaining
//creating certification path (chain to be validated)
CertPath path = cf.generateCertPath(certx);
//validator creation. Algorithm to be defined
CertPathValidator validator = CertPathValidator.getInstance(certPathValidatorAlgorithm);
//get key store
KeyStore keystore = getKeyStore(keyStorePassword);
//get list of CRLs (certificate revoke list)
Collection<? extends CRL> crls = getCrls(cf);
PKIXParameters params = new PKIXParameters(keystore);
CertStore store = CertStore.getInstance(certStoreType, new CollectionCertStoreParameters(crls));
params.addCertStore(store);
//Validate will throw an exception on invalid chains.
PKIXCertPathValidatorResult r = (PKIXCertPathValidatorResult) validator.validate(path, params);
r.getTrustAnchor();
如果是本地证书和 CRL ,则逻辑工作正常,但CA必须在外部。
因此必须自定义getKeyStore()和getCrls()才能访问外部CA服务器,建立受信任的连接等。
您能解释一下用于支持此功能的配置和协议(CMP)吗?是否有这样的事情BouncyCastle?
更新:实际上,它与浏览器和https都不相关。 在XML中,我们获得了base64编码的证书链。证书由CA颁发。我们需要验证链-以某种方式将其发送到CA并获得OK / NO OK响应,或者从CA获取CRL列表,并提供将有效的已颁发证书保留为链根的机制。