当前位置: 代码迷 >> Android >> android https透过加载pfx证书获取数据
  详细解决方案

android https透过加载pfx证书获取数据

热度:10   发布时间:2016-04-28 05:16:41.0
android https通过加载pfx证书获取数据

直接给代码吧,研究了几天才搞定......

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不能初始化为空.....问题解决了......

  相关解决方案