Validación de certificados digitales

A la hora de validar certificados existen dos posibilidades:

  • Utilizar la información contenida en los mismos que indica donde se puede encontrar un servidor OCSP o una CRL que permitan su validación.
  • Utilizar un servicio de validación, por ejemplo un servicio web, que valide el certificado.

Arangí permite utilizar las dos opciones.

Validacion mediante OCSP o CRL

Hay que recordar que la validación de un certificado implica también la validación de su cadena de confiaza por lo que si se quiere utilizar este tipo de validación, tal y como se dijo en el apartado de Certificados, sólo será posible validar mediante la clase ValidateCertificate o extensiones de la misma.

La validación de certificados mediante ValidateCertificate requiere la utilización de un objeto CAList que contiene los certificados de las CAs que componen la cadena de confianza del certificado. En la librería Arangí no es necesario pasar este objeto para la validación ya que la lista de certificados de CA viene contenida dentro de la librería (e incluye los certificados de las autoridades de certificación de la ACCV y del DNIe).

Por ejemplo, para validar un certificado de ciudadano:

CertificadoCiudadano certificado = ...

int resultadoValidacion;
if ((resultadoValidacion = certificado.validate()) != ValidationResult.RESULT_VALID) {
        throw new Exception("El certificado no es válido: " + resultadoValidacion);
}

El resultado del método validate() es un valor entero. Las constantes para interpretar dicho valor se encuentran en la clase es.accv.arangi.base.util.validation.ValidationResult de la librería base de Arangí. En el ejemplo, si el certificado no es válido se lanza una excepción.

IMPORTANTE: si el certificado que se trata de validar es de pruebas tenga en cuenta que debe tener acceso al OCSP de pruebas de la Agencia de Tecnología y Certificación Electrónica, que se encuentra en http://sleipnir3.accv.es:8086.

Validación mediante servicios de validación

Los servicios de validación permiten realizar la validación completa de un certificado (incluyendo su cadena de confianza). Por este motivo no es necesario construir un objeto CAList ni utilizar la clase ValidateCertificate. En este caso, la lista de certificados de CA admitidos será gestionada por el mismo servicio.

Para utilizar un servicio de validación se ha de implementar la interfaz es.accv.arangi.base.certificate.validation.service.CertificateValidationService. Sólo es necesario implementar un método al que se pasa un certificado y, si fuera necesario, algunos parámetro extra y ha de devolver un objeto de la clase es.accv.arangi.base.certificate.validation.service.CertificateValidationServiceResult.

Este resultado incluye:

  • result: Resultado de la validación interpretable con las mismas constantes que el resultado de la validación mediante OCSP y CRL. Este campo siempre debe devolverse con valor.
  • fields: Map con los nombres y valores de los campos más representativos del certificado.
  • revocationDate: Si el certificado se encuentra revocado contendrá la fecha de revocación.
  • revocationReason: Si el certificado se encuentra revocado contendrá el motivo de revocación.
  • ocspResponse: Respuesta OCSP que produjo la validación. Aunque este campo no es obligatorio si que es muy recomendable que se incluya en la respuesta.

Para validar un certificado mediante servicios de validación se utilizará el siguiente código:

Certificate certificado = ...

CertificateValidationService servicio1 = ...
List<CertificateValidationService> lServicios = new ArrayList<CertificateValidationService>();
lServicios.add(servicio1);

CertificateValidationServiceResult resultadoValidacion = certificado.validate(lServicios);
if (resultadoValidacion.getResult() != ValidationResult.RESULT_VALID) {
        throw new Exception("El certificado no es válido: " + resultadoValidacion);
}

Como puede observarse, al método 'validate' se le pasa una lista de servicios de validación. Arangí tratará de obtener una respuesta del primer servicio, pero si se produce un error (por ejemplo por no estar en linea) se intentará con el siguiente y así sucesivamente. Esta circunstancia nos permite utilizar varios servicios de validación.

En la librería base de Arangí se ha desarrollado una implementación del servicio de validación de certificados de @Firma. Su utilización se explica en el siguiente punto de esta web.

Comparación entre los dos tipos de validación

A la hora de elegir uno de los tipos de validación de certificados hay que tener en cuentra sobre todo qué tipo de certificados se van a aceptar en la aplicación. Utilizar un servicio de validación implica confiar en los certificados que utiliza dicho servicio y dejar en sus manos con qué certificados se va a poder trabajar. Por otra parte esta solución es mucho más cómoda ya que la gestión de nuevas Autoridades de Certificación se deja en manos del servicio, con lo que una nueva incorporación no implicará ningún cambio en la aplicación.

Un factor que puede resultar importante para el caso de que la aplicación se ejecute en un entorno protegido es el de las conexiones. La utilización de un servicio de validación implica que sólo se abrirán conexiones hacia ese servicio, mientras que si se utilizan OCSPs y CRLs se necesitará abrir las conexiones hacia estos sistemas de cada Autoridad de Certificación que se esté utilizando.

Por otra parte, los servicios de OCSP y CRL que ofrecen las Autoridades de Certificación son los más sensibles de sus sistemas y, salvo catástrofe, siempre permanecen funcionando. Los servicios de validación pueden ser más o menos confiables, pero no ofrecerán nunca las mismas garantías de funcionamiento.