2013-08-19 1 views
0

J'écris un projet qui pourrait obtenir le certificat Ldap à partir d'un serveur distant. Cela fonctionne bien pour le mode général lorsque le serveur ne nécessite pas de certification mutuelle. Mais lorsque j'essaie un serveur qui nécessite une certification mutuelle, il échoue. Voici le code:comment obtenir le certificat ldap contourner la certification mutuelle en utilisant Java

String serverSpec = null; 
    boolean enableAnonSuites = false; 
    boolean isTracing = false; 

    // Try and parse command line arguments. 
    try { 

     serverSpec = "ldap://10.47.16.60:389"; 
    } 

    catch (Exception e) { 
     trace(true,e.toString()); 
     usage(); 
     return; 
    } 

    try { 

     // Create a SocketFactory that will be given to LDAP for 
     // building SSL sockets 
     MySocketFactory msf = new MySocketFactory(isTracing, 
       enableAnonSuites); 

     // Set up environment for creating initial context 
     Hashtable env = new Hashtable(11); 
     env.put(Context.INITIAL_CONTEXT_FACTORY, 
       "com.sun.jndi.ldap.LdapCtxFactory"); 


     // Must use the name of the server that is found in its certificate 
     env.put(Context.PROVIDER_URL, 
       serverSpec 
       ); 

     // Create initial context 
     trace(isTracing,"Creating new Ldapcontext"); 
     LdapContext ctx = new InitialLdapContext(env, null); 

     // Start 
     trace(isTracing,"Performing StartTlsRequest"); 
     StartTlsResponse tls = null; 

     try { 
      tls = (StartTlsResponse)ctx.extendedOperation(new StartTlsRequest()); 
     } 
     catch (NamingException e) { 
      trace(true,"Unable to establish SSL connection:\n" 
        +e); 
      return; 
     } 


     // The default JSSE implementation will compare the hostname of 
     // the server with the hostname in the server's certificate, and 
     // will not proceed unless they match. To override this behaviour, 
     // you have to provide your own HostNameVerifier object. The 
     // example below simply bypasses the check 

     tls.setHostnameVerifier(new HostnameVerifier() { 
      public boolean verify(String hostname, SSLSession session) 
      { 
       return true; 
      } 
     }); 
     // Negotiate SSL on the connection using our own SocketFactory 
     trace(isTracing,"Negotiating SSL"); 
     SSLSession sess = null; 
     sess = tls.negotiate(msf); 

     X509Certificate[] cert = sess.getPeerCertificateChain(); 

Les informations d'exception est la suivante: « javax.net.ssl.SSLException: alerte fatale reçu: erreur interne », et il arrive à la méthode « négocier ». Et j'ai analysé les informations de trace wireshark et je suis sûr que c'est parce que le serveur nécessite une certification mutuelle. En ce moment, je me demande s'il y a une certaine classe qui est dans le paquetage com.sun.jndi.ldap qui pourrait être utile pour ce problème. Quelqu'un pourrait-il aider?

Répondre

3

Vous ne pouvez pas. S'il y avait une telle classe dans le JDK, ce ne serait pas sûr. Si le serveur requiert un certificat client et ne fonctionnera pas sans un certificat, vous devez en fournir un. C'est le point de l'exception.

+0

+1 pour emphase. Vous ne pouvez pas contourner l'authentification mutuelle si cela est requis par le serveur. – Syon

+0

Merci. Je pense que je n'ai pas clarifié ma question. Je veux dire, parce que le but ultime est d'obtenir le certificat et je peux voir de la trace de wireshack que le serveur m'a déjà envoyé le certificat (la certification mutuelle signifie que le serveur envoie le certificat au client et le client avec son certificat) . Et le client obtient le certificat avant la fin de la prise de contact. Donc, le problème est, je n'ai pas trouvé un moyen d'obtenir le certificat même si le serveur me l'a déjà envoyé. Existe-t-il un moyen d'obtenir le certificat en Java avant la fin de la prise de contact? – user2528892

Questions connexes