我需要使用自定义密钥库.jks文件和密码向URL发送请求。以下是一段代码。它不是很干净。我需要清理它:-)我看到ava.lang.NoSuchFieldError的一个例外。我不知道我在这里缺少什么: - /
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);
.............. //更多代码 }
public static KeyManager [] getKeyManagers(String keyStoreType,InputStream keyStoreFile,String keyStorePassword)抛出异常{ KeyStore keyStore = KeyStore.getInstance(keyStoreType); keyStore.load(keyStoreFile,keyStorePassword.toCharArray()); KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmf.init(keyStore,keyStorePassword.toCharArray()); return kmf.getKeyManagers(); }
我看到以下异常
java.lang.NoSuchFieldError:org / apache / http / protocol / HTTP.DEF_CONTENT_CHARSET 在org.apache.http.impl.client.DefaultHttpClient.setDefaultHttpParams(DefaultHttpClient.java:175) at org.apache.http.impl.client.DefaultHttpClient.createHttpParams(DefaultHttpClient.java:158) 在org.apache.http.impl.client.AbstractHttpClient.getParams(AbstractHttpClient.java:448) at org.apache.http.impl.client.AbstractHttpClient.createClientConnectionManager(AbstractHttpClient.java:309) 在org.apache.http.impl.client.AbstractHttpClient.getConnectionManager(AbstractHttpClient.java:466)
在 ClientConnectionManager manager = httpclient.getConnectionManager();
你能告诉我我在这里缺少什么吗?答案 0 :(得分:0)
使用SSL时通常就是这种情况,尤其是在使用第三方库时。基本上你有jar文件版本不匹配。检查您使用的jar文件的版本是否正确。你在使用像BouncyCastle这样的东西吗?检查这个jar的版本。