Desde la perspectiva de un programador, necesita algunas cosas para validar un certificado X.509.
- Un conjunto de "anclajes de confianza" — los certificados raíz de CA de los que depende. Deben protegerse contra manipulaciones, de modo que un atacante no reemplace un certificado de CA con su propia falsificación. Las claves públicas en estos certificados se utilizan para verificar las firmas digitales en otros certificados.
- Una colección de certificados intermedios. La aplicación puede mantener una colección de estos, pero la mayoría de los protocolos, como SSL y S/MIME, que usan certificados tienen una forma estándar de proporcionar certificados adicionales.Almacenar estos no requiere ningún cuidado especial; su integridad está protegida por la firma de una CA raíz.
- Información de revocación. Incluso si un CA emitió un certificado, podría haber sido revocado prematuramente debido a que se divulgó la clave privada, o la entidad final cambió su identidad. (Por ejemplo, una persona cambia de trabajo y se revoca un certificado con el nombre de su empresa anterior). Las CRL o un servicio web como OCSP se pueden usar para obtener una actualización sobre el estado de un certificado.
Con estas entradas disponibles, puede usar el built-in PKIX support para construir y validar una ruta de certificado.
/* 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);
Una cosa importante a tener en cuenta es que si no se puede encontrar una ruta, no se obtiene mucha información sobre el motivo. Esto puede ser frustrante, pero es así por diseño. En general, hay muchos caminos potenciales. Si todos fallan por diferentes razones, ¿cómo decidiría el constructor de ruta qué informar como motivo?
Gracias por su explicación detallada del concepto CA. Lo entiendo ahora Solo tengo que descubrir los detalles sobre el nivel de programación ahora. – Rob