Read out incoming certificate in Tomcat

后端 未结 2 1046
余生分开走
余生分开走 2020-12-03 05:34

i use a tomcat http connector with client-authentification. If a client start a new connection to my server and sends his certificate, can i get the certificate and read the

相关标签:
2条回答
  • 2020-12-03 06:14

    Credit to mazaneicha:

            String cipherSuite = (String) req.getAttribute("javax.servlet.request.cipher_suite");
    
            if (cipherSuite != null) {
                X509Certificate certChain[] = (X509Certificate[]) req.getAttribute("javax.servlet.request.X509Certificate");
                if (certChain != null) {
                    for (int i = 0; i < certChaNin.length; i++) {
                        System.out.println ("Client Certificate [" + i + "] = "
                                + certChain[i].toString());
                    }
                }
            }
    
    0 讨论(0)
  • 2020-12-03 06:40

    You can get the client certificate chain by getting the javax.servlet.request.X509Certificate attribute on your HttpServletRequest. This is an array of X509Certificates where the first one (position 0) is the actual client certificate (the rest of the chain may be present if intermediate CA certificates are required).

    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();
    

    You can then get the various RDNs (relative distinguished name) in this principal (e.g. CN) as described in 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());
    }
    

    (You could also use BouncyCastle's X509Name to get each RDN.)

    In an X.509 certificate, the Subject DN is an ordered sequence of RDNs, each of which is a set of AVAs (Attribute Value Assertions), for example CN=... or O=.... In principle, there can be multiple AVAs per RDN, which would cause problems here, but this is very rare. You can almost assume that there is only one AVA per RDN. (Perhaps this answer might be of interest.)

    0 讨论(0)
提交回复
热议问题