es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Forma correcta de verificar si un X509Certificate es una autoridad de certificación raíz

Tengo una lista de X509Certificates y me gustaría comprobar si son una CA y, en este caso, si son una CA raíz. Entonces estoy utilizando este código:

Para comprobar si esto es una CA:

private boolean isCa(@NotNull X509Certificate certificate) {
        if (certificate.getBasicConstraints() != -1 && certificate.getKeyUsage()[5] == true) {
            return true;
        }
        return false;
    }

Según la documentación, solo debería verificar getBasicConstraints, pero también compruebo que el certificado se pueda usar para firmar (verificando keyCertSign).

También me gustaría comprobar si el certificado es una CA raíz. Así que comparo el nombre distinguido del emisor y el nombre distinguido del sujeto para verificar que sean iguales. En este caso, asumo que es una CA raíz:

try{
X500Principal idn = certificate.getIssuerX500Principal();
X500Principal sdn = certificate.getSubjectX500Principal();
certificate.verify(certificate.getPublicKey());
return idn.equals(sdn);
}
catch(Exception e){
return false;
}

¿Es correcto este método de validación?
Actualización: Añadir la verificación de auto-firma.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en certificados SSL y X.509, puedo confirmar que el método de validación para determinar si un certificado X.509 dado es una CA y una CA raíz es generalmente correcto.

    El método isCa verifica si el certificado tiene un valor no negativo para el campo basicConstraints y si puede ser utilizado para firmar otros certificados (keyCertSign establecido en true). Esta es la forma recomendada de verificar si un certificado X.509 es una CA.

    Para verificar si el certificado es una CA raíz, el código dado compara los nombres distintivos issuer y subject, los cuales deben ser iguales para una CA raíz. Sin embargo, también es necesario verificar que el certificado esté auto-firmado, es decir, que el issuer y el subject sean la misma entidad y que su clave pública sea la misma que la del certificado que se está verificando. Esto se puede hacer utilizando el método certificate.verify(certificate.getPublicKey()), como se muestra en el código dado. Si esta verificación falla, el certificado no es una CA raíz.

    Por lo tanto, el código actualizado para verificar si un certificado X.509 dado es una CA raíz sería:

    private boolean isRootCA(@NotNull X509Certificate certificate) {
       if (!certificate.getSubjectX500Principal().equals(certificate.getIssuerX500Principal())) {
           return false;
       }
    
       try {
           certificate.verify(certificate.getPublicKey());
           return true;
       } catch(Exception e) {
           return false;
       }
    }
    

    En general, este es un método confiable para verificar si un certificado X.509 dado es una CA y una CA raíz.

Comments are closed.