, usted puede obtener la cadena de certificados de cliente al obtener el atributo javax.servlet.request.X509Certificate
en su HttpServletRequest
. Esta es una matriz de X509Certificate
s donde la primera (posición 0) es el certificado del cliente real (el resto de la cadena puede estar presente si se requieren certificados CA intermedios).
X509Certificate certs[] =
(X509Certificate[])req.getAttribute("javax.servlet.request.X509Certificate");
// ... Test if non-null, non-empty.
X509Certificate clientCert = certs[0];
// Get the Subject DN's X500Principal
X500Principal subjectDN = clientCert.getSubjectX500Principal();
, entonces puede obtener los diversos RDN (nombre completo relativo) en este principal (por ejemplo, CN) como se describe en this answer:
import javax.naming.ldap.LdapName;
import javax.naming.ldap.Rdn;
String dn = subjectDN.getName();
LdapName ldapDN = new LdapName(dn);
for(Rdn rdn: ldapDN.getRdns()) {
System.out.println(rdn.getType() + " -> " + rdn.getValue());
}
(también se podría utilizar BouncyCastle de X509Name
para obtener cada RDN.)
En un certificado X.509, el DN del sujeto es una secuencia ordenada de RDN, cada uno de los cuales es un conjunto de AVA (Aserciones de valor de atributo), por ejemplo CN=...
o O=...
. En principio, puede haber múltiples AVA por RDN, lo que causaría problemas aquí, pero esto es muy raro. Casi puede suponer que solo hay un AVA por RDN. (Tal vez this answer podría ser de interés.)
http://www.coderanch.com/t/438788/Security/Read-client-certificate-Servlet mirada hacia el final de la entrada. ¡Buena suerte! – mazaneicha