直接给代码吧,研究了几天才搞定......
public static final String CLIENT_KET_PASSWORD = "Ku6OpqKDfN4=305790"; // public static String getNewHttpClient(String url) { try { // KeyStore trustStore = KeyStore.getInstance("PKCS12", "BC"); // trustStore // .load(PcPostApplication.getInstance().getAssets() // .open("abc.pfx"), CLIENT_KET_PASSWORD.toCharArray()); SSLSocketFactory sf = new SSLSocketFactoryEx(AppConfig.mKeyStore, AppConfig.CERTFILE_PASSWORD.toCharArray()); sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); HttpParams params = new BasicHttpParams(); HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); SchemeRegistry registry = new SchemeRegistry(); registry.register(new Scheme("http", PlainSocketFactory .getSocketFactory(), 80)); registry.register(new Scheme("https", sf, 443)); HttpClient client = null; String msg = ""; try { ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); client = new DefaultHttpClient(ccm, params); HttpGet hg = new HttpGet(url); HttpResponse response = client.execute(hg); HttpEntity entity = response.getEntity(); if (entity != null) { InputStream instreams = entity.getContent(); msg = convertStreamToString(instreams); } return msg; } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } catch (Exception e) { e.printStackTrace(); } return ""; } public static String convertStreamToString(InputStream is) { BufferedReader reader = new BufferedReader(new InputStreamReader(is)); StringBuilder sb = new StringBuilder(); String line = ""; try { while ((line = reader.readLine()) != null) { sb.append(line + "\n"); } } catch (IOException e) { e.printStackTrace(); } finally { try { is.close(); } catch (IOException e) { e.printStackTrace(); } } return sb.toString(); }上面的加载证书并请求,但是在这需要注意一个问题SSLSocketFactory需要自定义,看下面自定义的代码:
public class SSLSocketFactoryEx extends SSLSocketFactory{ SSLContext sslContext = SSLContext.getInstance("TLS"); public SSLSocketFactoryEx(KeyStore truststore, char[] arry) throws NoSuchAlgorithmException, KeyManagementException, KeyStoreException, UnrecoverableKeyException { super(truststore); KeyManagerFactory localKeyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory .getDefaultAlgorithm()); localKeyManagerFactory.init(truststore, arry); KeyManager[] arrayOfKeyManager = localKeyManagerFactory.getKeyManagers(); TrustManager tm = new X509TrustManager() { @Override public X509Certificate[] getAcceptedIssuers() { return null; } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { } @Override public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { } }; sslContext.init(arrayOfKeyManager, new TrustManager[] { tm }, new java.security.SecureRandom()); } @Override public Socket createSocket(Socket socket, String host, int port, boolean autoClose) throws IOException, UnknownHostException { return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose); } @Override public Socket createSocket() throws IOException { return sslContext.getSocketFactory().createSocket(); }}
因为是双向握手,那个sslcontext不能初始化为空.....问题解决了......