//Пример иллюстрирует работу с хранилищем по протоколу Ldap, поиск сертификатов в указанном хранилище,  и работу со службами Certex
//Пакеты необходимые для раьоты программы. Входят в стандартный набор JDK 1.6......
import java.io.ByteArrayInputStream;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.util.*;
import javax.naming.ldap.*;
import javax.naming.*;
import java.security.Provider;
import java.security.cert.X509Certificate;
import java.io.*;

class workWithService
{
    public static class RegisterRequest implements ExtendedRequest
    {
        public byte [] cert;
        RegisterRequest(byte[] certificate)
        {
            this.cert = certificate;
        }
        public String getID()
        {
            //return "1.3.6.1.4.1.6801.11.1.4";//Отправка запроса на службу Verify . ощвращает 0 если все OK!, иначе число больше 0.
            return "1.3.6.1.4.1.6801.11.1.4";//Отправка запроса на службу Verify.
            //return "1.3.6.1.4.1.6801.11.1.10"; //Отправка запроса на RA.
        }
        public byte[] getEncodedValue()
        {
            return cert;
        }
        public ExtendedResponse createExtendedResponse(String id, byte[] berValue, int offset, int length) throws NamingException
        {
            return new RegisterResponse(id, berValue, offset, length);
        }
    }

    public static class RegisterResponse implements ExtendedResponse
    {
        byte[] cert;
        private X509Certificate sd;
        public RegisterResponse(String id, byte[] berValue, int offset, int length) throws NamingException
        {
            //Cлужба вернула ответ в  byte[] berValue
            //В этом методе можно писать код по обработке, записи в файл и т.д. над berValue
            System.out.println(berValue.toString());
        }
        public String getID()
        {
            // return "1.3.6.1.4.1.6801.11.1.4";//Отправка запроса на службу Verify//ощвращает 0 если все OK!, иначе число больше 0.
            return "1.3.6.1.4.1.6801.11.1.4";
           // return "1.3.6.1.4.1.6801.11.1.10"; //RA
        }

        public byte[] getEncodedValue()
        {
            return cert;
        }
    }

    public static void main(String args[])
    {
        try
        {
            //Чтение введенных параметров в консоль--------------
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

            String arg[] = new String[4];
            int i=0;
            while(i<arg.length)
            {
                switch(i)
                {
                    case 0: System.out.print("Enter ip store: ");break;
                    case 1: System.out.print("Enter user name: ");break;
                    case 2: System.out.print("Enter user password: ");break;
                    case 3: System.out.print("Eneter DN name: ");break;
                }
                arg[i] = br.readLine();
                if(arg[i].length()!=0)
                    i++;
            }

            String ldapURL = arg[0];
            String userName = "dn:t=L;cn="+arg[1];
            String userPass = arg[2];
            String dnName = arg[3];
            //------------------------------------------------------------------------------
            //Настройка параметров для получения контекса соединения с сервером по Ldap
            Hashtable<String, String> env = new Hashtable<String, String>();
            env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
            env.put(Context.SECURITY_AUTHENTICATION,"DIGEST-MD5");
            env.put(Context.PROVIDER_URL,ldapURL);
            env.put(Context.SECURITY_PRINCIPAL,userName);
            env.put(Context.SECURITY_CREDENTIALS,userPass);
            //env.put("java.naming.ldap.attributes.binary","userTemplate");

           env.put(Context.PROVIDER_URL,ldapURL);

           LdapContext ctx = new InitialLdapContext(env, null);
          //В Base64cer  передается сертификат, который будет передаваться на службу. В примере я вбил константой......
           String Base64cer = "MIICoTCCAkqgAwIBAgIg4fVFfw41L7LutkNtMrdQ09o9OkatV5nlMSUDC92oOSQw"+
"DgYKKwYBBAG1EQECAgUAMCkxCzAJBgNVBAMTAkNBMQ0wCwYDVQQKEwRLSVNDMQsw"+
"CQYDVQQGEwJLWjAeFw0xMDAxMjEwNzQyMDVaFw0xMTAxMjEwNzQyMDVaME4xCzAJ"+
"BgNVBAYTAktaMQ4wDAYDVQQKEwVnYW1tYTEYMBYGA1UEAxMPRXJtb2xhZXYgQW5k"+
"cmV5MRUwEwYDVQQFEwwzMzMzMzMzMzMzMzMwYzAOBgorBgEEAbURAQUIBQADUQAG"+
"AgAAOqoAAABFQzEAAgAA5KT41LMxBzGSTC4ZOLufGSgVD+AeQfVRNzH2I/H81CIS"+
"Fji/+3RhYfo0xxebmoxwU29JL7/AVPM/cZh1L5amNaOCAQ8wggELMAsGA1UdDwQE"+
"AwIGwDATBgNVHSUEDDAKBggrBgEFBQcDBDA+BgNVHR8ENzA1MDOgMaAvhi1odHRw"+
"Oi8vMTkyLjE2OC4xMi42OjYyMjgwL2NnaS9SZXZMaXN0R09TVC5jcmwwKQYDVR0O"+
"BCIEIOH1RX8ONS+y7rZDbTK3UNPaPTpGrVeZ5TElAwvdqDkkMHwGA1UdIwR1MHOA"+
"ILqRYBzlPl2EpoHNaK0VnCK7jCLNb/HV17GjmeAzmiUloS2kKzApMQswCQYDVQQD"+
"EwJDQTENMAsGA1UEChMES0lTQzELMAkGA1UEBhMCS1qCILqRYBzlPl2EpoHNaK0V"+
"nCK7jCLNb/HV17GjmeAzmiUlMA4GCisGAQQBtREBAgIFAANBAJVpX59cZiOr8Kts"+
"xL2en4umAk5xxPoz5uJR59NSYUlFu8E7+JIJKlC8ji7SreY34kEfadL/33r+WwsZ"+
"1+CtYHc=";
           RegisterRequest request = new RegisterRequest(Base64cer.getBytes());
           ExtendedResponse response =  ctx.extendedOperation(request);
       }
       catch (Exception ex)
       {
            ex.printStackTrace();
       }
    }
}