è possibile ottenere la catena di certificati client ottenere l'attributo javax.servlet.request.X509Certificate
sul HttpServletRequest
. Questo è un array di X509Certificate
s dove il primo (posizione 0) è il vero certificato client (il resto della catena potrebbe essere presente se sono richiesti certificati CA intermedi).
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();
È possibile quindi ottenere i vari RDNs (nome distinto relativo) di questo principio (ad esempio CN), come descritto nella 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());
}
(si potrebbe anche usare BouncyCastle di X509Name
per ottenere ogni RDN.)
In un certificato X.509, il DN soggetto è una sequenza ordinata di RDN, ognuno dei quali è un insieme di AVA (Attribute Value Assertions), ad esempio CN=...
o O=...
. In linea di principio, possono esserci più AVA per RDN, che potrebbero causare problemi qui, ma questo è molto raro. Si può quasi presumere che ci sia solo un AVA per RDN. (Forse this answer potrebbero essere di interesse.)
http://www.coderanch.com/t/438788/Security/Read-client-certificate-Servlet sguardo verso la fine del post. In bocca al lupo! – mazaneicha