example - generate x509 certificate java
Valide certificados X509 utilizando Java APis (3)
Lo que está haciendo aquí es verificar si un certificado (en su ejemplo de certificado) ha sido firmado ( directamente ) por alguna de las CA confiables en el almacén de confianza.
Además, verifica la caducidad, pero no se realiza la comprobación de revocación.
Por lo tanto, si el cert
no ha sido firmado por ninguna de las CA de confianza, obtendrá una excepción.
Por lo tanto, el código es suficiente para verificar si el certificado ha sido firmado por alguna de las CA confiables.
Si se refiere a la autenticación del servidor, entonces el código en la publicación no es suficiente.
Este código solo verifica que un certificado específico está firmado por una CA de confianza.
No tiene ninguna indicación, sin embargo, si la "entidad" que le envía este certificado es en realidad el propietario del certificado (es decir, posee la clave privada asociada con este certificado).
Esto es parte de la autenticación SSL, donde, por ejemplo, el cliente envía el mensaje ClientKeyExchange
cifrado con la clave pública del servidor remoto y está seguro de que si la otra parte es falsa, no será posible descifrar el mensaje.
Estoy tratando de validar un certificado contra el almacén de claves de Java y este es el código que estoy usando como se muestra a continuación. Si se completa con éxito, asumo que la validación se ha realizado correctamente, de lo contrario, si se lanza una excepción, la validación falla. Mi preocupación es:
¿Es el código de abajo suficiente para validar un certificado? ¿Cómo es que me estoy perdiendo algo aquí (como revisar los datos firmados por la computadora que me envía el certificado)? 2. ¿Debería verificarse la firma contenida en el certificado? Si es así, ¿cómo?
Gracias de antemano por la respuesta! Pradeep
// To check the validity of the dates
cert.checkValidity();
//Check the chain
CertificateFactory cf = CertificateFactory.getInstance("X.509");
List<X509Certificate> mylist = new ArrayList<X509Certificate>();
mylist.add(cert);
CertPath cp = cf.generateCertPath(mylist);
PKIXParameters params = new PKIXParameters(getTrustStore());
params.setRevocationEnabled(false);
CertPathValidator cpv =
CertPathValidator.getInstance(CertPathValidator.getDefaultType());
PKIXCertPathValidatorResult pkixCertPathValidatorResult =
(PKIXCertPathValidatorResult) cpv.validate(cp, params);
Normalmente, un certificado será emitido por una autoridad emisora intermedia, no una autoridad "raíz" (que es todo lo que debería estar en su almacén de confianza). La mayoría de los protocolos recomiendan enviar una "cadena" de certificados, no solo el certificado de la entidad.
Debe agregar todos los certificados intermedios para que se pueda formar una cadena completa.
Para asegurarse de que el certificado sigue siendo válido, no debe desactivar las verificaciones de revocación. Si no desea recuperar una CRL (que puede ser grande), el emisor puede ofrecer soporte OCSP. Pero, esto debe habilitarse en el tiempo de ejecución de Java mediante la configuración de ciertas propiedades del sistema.
Si el validador de ruta regresa exitosamente, no necesita verificar nada más. Si el certificado no es válido, se generará una excepción.
Además, una comprobación explícita de la fecha de validez no es necesaria. Esto ocurre durante la validación (usando la hora actual, a menos que especifique una hora a través de los PKIXParameters
).
Para una discusión más extensa sobre la validación, incluido el código de muestra, consulte una de mis respuestas anteriores.
Si está satisfecho con la configuración de confianza predeterminada (ya que se usarían para el SSLContext
predeterminado), podría crear un X509TrustManager
independientemente de SSL / TLS y usarlo para verificar su certificado de forma independiente.
Se vería así:
TrustManagerFactory trustManagerFactory =
TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init((KeyStore)null);
// you could use a non-default KeyStore as your truststore too, instead of null.
for (TrustManager trustManager: trustManagerFactory.getTrustManagers()) {
if (trustManager instanceof X509TrustManager) {
X509TrustManager x509TrustManager = (X509TrustManager)trustManager;
x509TrustManager.checkServerTrusted(...);
}
}
(También debe verificar la identidad del servidor y la coincidencia del certificado, consulte RFC 6125 (Representación y verificación de la identidad del servicio de aplicación basada en dominio en la infraestructura de claves públicas de Internet usando certificados X.509 (PKIX) en el contexto de la seguridad de la capa de transporte (TLS) ) .)