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.
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 elcertificado
tiene un valor no negativo para el campobasicConstraints
y si puede ser utilizado para firmar otros certificados (keyCertSign
establecido entrue
). 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
ysubject
, 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 elissuer
y elsubject
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étodocertificate.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:
En general, este es un método confiable para verificar si un certificado X.509 dado es una CA y una CA raíz.