yo uso un tomcat http conector con el cliente de autenticación. Si un cliente inicie una conexión nueva a mi servidor y envía su certificado, puedo obtener el certificado y leer el nombre común de la entrantes certificado en mi código de java. Si sí, ¿cómo?

gracias
adi

InformationsquelleAutor adihubba | 2012-08-14

2 Comentarios

  1. 19

    Usted puede obtener el certificado de cliente de la cadena, consiguiendo que el javax.servlet.request.X509Certificate atributo en su HttpServletRequest. Esta es una matriz de X509Certificates donde el primero (posición 0) es el certificado de cliente (el resto de la cadena puede estar presente si la CA intermedia que se requieren certificados).

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

    Usted puede obtener los diversos Rdn (nombre completo relativo) de este principal (por ejemplo, CN), como se describe en esta respuesta:

    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 puede utilizar BouncyCastle del X509Name para obtener cada una de las RDN).

    En una X. 509 certificado, el Sujeto DN es una secuencia ordenada de RDNs, cada uno de los cuales es un conjunto de AVAs (Valor de Atributo de Afirmaciones), por ejemplo CN=... o O=.... En principio, puede haber varios AVAs por RDN, lo que podría causar problemas aquí, pero esto es muy raro. Casi se puede asumir que sólo hay un AVA por RDN. (Tal vez esta respuesta podría ser de su interés.)

    • gracias, todo funcionó muy bien al primer intento 🙂 para todo el mundo que utiliza axis2 y no saben cómo entrar en el HttpServletRequest: MessageContext contexto = MessageContext.getCurrentMessageContext(); HttpServletRequest requestProperty = (HttpServletRequest) contexto.getProperty(HTTPConstants.MC_HTTP_SERVLETREQUEST);
    • Estoy recibiendo null para req.getAttribute(«javax.servlet.solicitud.X509Certificate»). es necesario enviar la solicitud desde el mismo dominio? He intentado de locales (mediante localhost) de la máquina y en el servidor de desarrollo también.
    • Que probablemente significa (a) que el servidor no está configurado para pedir/exigir un certificado de cliente, o (b) la certificación de las autoridades de la lista se envía cuando se solicita un cliente cert no coincide con ninguno de los certificados de cliente que tiene en su equipo. No es realmente acerca de «dominio» coincidencia pero sobre CA la coincidencia.
    • se requiere obligatorio para la importación de certificado de cliente en el almacén de claves de servidor para extraer/leer información de certificado de cliente? Yo manualmente certificado exportado desde el navegador y, a continuación, trató de leer la info de la eso y tengo éxito, pero sin la necesidad de exportar y el uso de req.atributo método de obtención de null en el servidor.
    • Es el certificado de la CA que se utiliza para emitir el certificado de cliente que usted necesita para tener en el server almacén de confianza (no de almacén de claves).
    • ok. Gracias @Bruno.

  2. 1

    De crédito a 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());
                    }
                }
            }
    • Usted no necesita conseguir y probar la suite de cifrado de primera.

Dejar respuesta

Please enter your comment!
Please enter your name here