1
votes

I need send a request to URL with custom keystore .jks file and password . Here is the following piece of code . It is not very clean. I need to clean it up :-) I see an exception of ava.lang.NoSuchFieldError. I have no clue what i am missing here :-/

    try{

                   KeyStore truststore = KeyStore.getInstance(KeyStore.getDefaultType());
        InputStream keystoreInput = new FileInputStream(KEY_STORE_PATH);
        truststore.load(keystoreInput, KEY_STORE_PASSWORD.toCharArray());
        System.out.println("Keystore has " + truststore.size() + " keys"); 

        TrustManagerFactory trustManagerFact = TrustManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
        trustManagerFact.init(truststore);

        SSLContext sslContext = SSLContext.getInstance("TLS");
        TrustManager[] trustManagers = trustManagerFact.getTrustManagers();

        KeyManager[] keyManagers = getKeyManagers("jks", new FileInputStream(KEY_STORE_PATH), KEY_STORE_PASSWORD.toString());
        sslContext.init(keyManagers, trustManagers, new SecureRandom());
        SSLSocketFactory socketFactory = new SSLSocketFactory(sslContext,new StrictHostnameVerifier());
        //sslContext.init(keyManagers, trustManagers, new SecureRandom());

        SchemeRegistry schemeRegistry = new SchemeRegistry();
        schemeRegistry.register(new Scheme("https", 443, socketFactory));


        // This is the default port number only; others are allowed

           System.out.println("Trying to get connection");
        //DefaultHttpClient httpclient = new DefaultHttpClient();

        ClientConnectionManager manager = httpclient.getConnectionManager();
         System.out.println("got connection");
        manager.getSchemeRegistry().register(new Scheme("https", 443, socketFactory));

        HttpGet httpget = new HttpGet(serviceUrl);

        // SOAP request send

        response = httpclient.execute(httpget);

..............//some more code }

public static KeyManager[] getKeyManagers(String keyStoreType, InputStream keyStoreFile, String keyStorePassword) throws Exception { KeyStore keyStore = KeyStore.getInstance(keyStoreType); keyStore.load(keyStoreFile, keyStorePassword.toCharArray()); KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmf.init(keyStore, keyStorePassword.toCharArray()); return kmf.getKeyManagers(); }

I see following exception

java.lang.NoSuchFieldError: org/apache/http/protocol/HTTP.DEF_CONTENT_CHARSET at org.apache.http.impl.client.DefaultHttpClient.setDefaultHttpParams(DefaultHttpClient.java:175) at org.apache.http.impl.client.DefaultHttpClient.createHttpParams(DefaultHttpClient.java:158) at org.apache.http.impl.client.AbstractHttpClient.getParams(AbstractHttpClient.java:448) at org.apache.http.impl.client.AbstractHttpClient.createClientConnectionManager(AbstractHttpClient.java:309) at org.apache.http.impl.client.AbstractHttpClient.getConnectionManager(AbstractHttpClient.java:466)

at ClientConnectionManager manager = httpclient.getConnectionManager();

Can you guys tell me what I am missing here ?

1

1 Answers

0
votes

This is often the case when using SSL especially when using 3rd party libraries. Basically you have jar file version mismatch. Check that the version of the jar files you are using are correct. Are you using something like BouncyCastle. Check the version of this jar.